编程-String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?

问题描述

String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?
如题,这是代码:
String s = ""A1B2C3D4E5F6G7H8"";
String[] b = new String[8];
System.out.println(""b:"" + b.length);
b = s.split(""[A-Z]"");
System.out.println(""b:"" + b.length);
输出结果就是:
b:8
b:9

解决方案

不是数组长度加1,是这个引用指向了新的数组。其相当于。
String[] b = new String[8];

b = new String[9];

你又赋了一遍值。

解决方案二:
不是数组长度加1,是这个引用指向了新的数组。其相当于。
String[] b = new String[8];

b = new String[9];

你又赋了一遍值。

基于你又问的问题哈。为什么第一个是空,你的这段代码在JDK中的实现如下:
String s = ""A1B2C3D4E5F6G7H8"";
Pattern p = Pattern.compile(""[A-Z]"");
Matcher m = p.matcher(s);

    int index = 0;    ArrayList<String> matchList = new ArrayList<String>();    boolean matchLimited = false;    while(m.find()) {        String match = s.subSequence(index m.start()).toString();        matchList.add(match);        index = m.end();    }    String[] b = null;    // Add remaining segment    if (!matchLimited || matchList.size() < 0)        matchList.add(s.subSequence(index s.length()).toString());    // Construct result    int resultSize = matchList.size();    while (resultSize > 0 && matchList.get(resultSize-1).equals("""")){        resultSize--;    }    String[] result = new String[resultSize];    b = matchList.subList(0 resultSize).toArray(result);    System.out.println(""b0:"" + b[0]);

使用的正则表达式。
然后用一个ArrayList来保存匹配到的字符。
有这样一段:String match = s.subSequence(index m.start()).toString();
给list中的第一个元素赋的值为从0开始从匹配字符的开始位结束,就也是0了。所以list中的第一个元素就是空的。

后面还有一段:
while (resultSize > 0 && matchList.get(resultSize-1).equals("""")){
resultSize--;
}
这一段把尾部的所有为空的都去除了,但是没有去除首部的,因此list中的第一个还是空。
最后转化为数组的时候第一个元素就是空了。

个人认为这个可以算JDK的一个小bug吧。

时间: 2024-08-30 10:11:55

编程-String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?的相关文章

string类equals方兴方法null和&quot;&quot;的比较区别

string类equals方兴方法null和""的比较区别 '声明 Public Shared Function Equals ( _  a As String, _  b As String, _  comparisonType As StringComparison _ ) As Boolean 参数 a 类型:System.String 要比较的第一个字符串,或 Nothing. b 类型:System.String 要比较的第二个字符串,或 Nothing. compariso

Java面向对象基础--String类中常用的方法

split()和replaceAll()这两个方法需要正则支持. public class StringAPIDemo06{ public static void mian(String args[]){ String str1 = " hello "; //定义字符串 System.out.println(str1.trim());//去掉左右空格后输出 } }

Java编程那些事儿75——String类使用

9.5.3 String和StringBuffer String和StringBuffer类都是代表字符串,也就是任意多个字符组成的序列.程序需要存储的大量文字一般都使用字符串进行代表.在这两个类中,包含了大部分关于字符串操作的方法,在实际操作字符串时,可以首先查阅这两个类中的方法. String和StringBuffer虽然都代表字符串,但是由于两个类内部实现的区别,所以一般把String看成不可变字符串,而把StringBuffer看成可变字符串,对于String的每次改变(例如字符串连接等

Java的string类常量池及不可变性

1.String常量池     当使用new String("hello")时,JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的对象被保存在堆内存中.即new String("hello")一共产生了两个字符串对象. [常量池constant pool]管理在编译时被确定并保存在已编译的.class文件中的一些数据,包括关于类.方法.接口中的常量,和字符串常量.  [字符串常量池

Java的string类为什么是不可变的_java

答案一: 最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类. 复制代码 代码如下: String s = "ABC";  s.toLowerCase(); 如上s.toLowerCase()并没有改变"ABC"的值,而是创建了

PL/SQL实现JAVA中的split()方法的例子_java

众所周知,java中为String类提供了split()字符串分割的方法,所以很容易将字符串以指定的符号分割为一个字符串数组.但是在pl/sql中并没有提供像java中的split()方法,所以要想在pl/sql中实现字符串的分割还需要自己动手.由于在项目中需要用到此类方法,所以自己研究了一下,方便以后参考.这里以逗号作为分隔符为例,代码如下: declare v_str varchar2(200) := 'abd,324,u78,23f,sd09,2345,dsaf,9079'; type s

J2SE综合之浅谈String类的相关应用

字符串类,包含了字符串的值和实现字符串相关操作的一些方法. 其实字符串在java中的实现比较特殊,你可以不使用构造方法,就可以直接获得一个字符串对象. String str1 = "test";//不使用构造方法 String str2 = new String("test");//使用构造方法 实际上以上两者的效果是相同的,就是创建了一个内容为"test"的字符串. 下面我们来说一下String类本身的特性. 首先需要注意到的是String是一

Java多线程编程中使用Condition类操作锁的方法详解_java

Condition的作用是对锁进行更精确的控制.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法.不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的:而Condition是需要与"互斥

Android编程实现禁止状态栏下拉的方法详解

本文实例讲述了Android编程实现禁止状态栏下拉的方法.分享给大家供大家参考,具体如下: 简介 项目需求APP全屏时,要禁止状态栏的下拉,这个应该是一个普遍的需求了吧,但Android系统没有直接提供给普通APP直接调用的接口.那么我们只能自己想办法增加接口去实现该功能了. 具体实现方法 1. 修改SystemUI 路径:==/frameworks/base/packages/SystemUI//src/com/android/systemui/statusbar/phone/PhoneSta