如题,这是代码:
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];
你又赋了一遍值。
基于你又问的问题哈。为什么第一个是空,你的这段代码在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吧。
不是数组长度加1,是这个引用指向了新的数组。其相当于。
String[] b = new String[8];
b = new String[9];
你又赋了一遍值。