[英]Strange behavior of Java String split() method
我有一个采用字符串参数并用#分割字符串的方法,分割后将打印数组的长度以及数组元素。 下面是我的代码
public void StringSplitTesting(String inputString) {
String tokenArray[] = inputString.split("#");
System.out.println("tokenArray length is " + tokenArray.length
+ " and array elements are " + Arrays.toString(tokenArray));
}
情况I:现在,当我的输入为abc#时 ,输出为tokenArray length is 1 and array elements are [abc]
情况二:但是当我的输入为#abc时 ,输出为tokenArray length is 2 and array elements are [, abc]
但是我期望两种情况下的输出相同。 此实现背后的原因是什么? 为什么split()方法的行为如此? 有人可以给我适当的解释吗?
单参数split
方法的行为的一个方面可能令人惊讶-从返回的数组中丢弃尾随的null。
因此,结尾的空字符串不包括在结果数组中。
要使每种情况的长度为2
,可以将负的第二个参数传递给double 参数的split
方法 ,这意味着该长度是不受限制的,并且不会丢弃任何尾随的空字符串。
只需看一下文档:
因此,结尾的空字符串不包括在结果数组中。
因此,在情况1中,输出为{"abc", ""}
但是Java剪切了结尾的空String。 如果您不希望尾随的空String被丢弃,则必须使用split("#", -1)
。
观察到的行为归因于Java中substring()方法的固有不对称特性:
这是split()实现的核心:
while ((next = indexOf(ch, off)) != -1) {
if (!limited || list.size() < limit - 1) {
list.add(substring(off, next));
off = next + 1;
} else { // last one
//assert (list.size() == limit - 1);
list.add(substring(off, value.length));
off = value.length;
break;
}
}
理解上述代码的行为的关键是理解substring()方法的行为:
从Javadocs:
字符串java.lang.String.substring(int beginIndex,int endIndex)
返回一个新字符串,该字符串是该字符串的子字符串。 子字符串从指定的beginIndex开始,并扩展到索引endIndex-1处的字符。因此,子字符串的长度为endIndex-beginIndex。
例子:
“ hamburger” .substring(4,8)返回“ urge”(不是“ urger”)
“ smiles” .substring(1,5)返回“ mile”(不是“ miles”)
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.