问题描述
- 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