如题,这是代码:
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

String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- three_man 2014-10-23 06:18关注
不是数组长度加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吧。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报