我有一个方法,它接受一个字符串参数并用#分割字符串,并在分割后打印出数组的长度以及数组元素。以下是我的代码
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()方法的行为是这样的?有人能给我正确的解释吗?
答案 0 :(得分:3)
one-argument split
method行为的一个方面可能令人惊讶 - 从返回的数组中丢弃尾随空值。
因此,结尾的空字符串不包含在结果数组中。
要为每种情况获得2
的长度,您可以将第二个参数传递给two-argument split
method,这意味着长度不受限制且不会丢弃尾随的空字符串。
答案 1 :(得分:2)
请查看文档:
因此,结果中不包括尾随空字符串 阵列。
因此,在情况1中,输出将为{"abc", ""}
,但Java会删除尾随的空字符串。
如果您不希望丢弃尾随的空字符串,则必须使用split("#", -1)
。
答案 2 :(得分:0)
观察到的行为是由于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:
String java.lang.String.substring(int beginIndex,int endIndex)
返回一个新字符串,该字符串是此字符串的子字符串。子串 从指定的beginIndex开始并扩展到index处的字符 endIndex - 1.因此子字符串的长度是endIndex-beginIndex。
示例:
&#34; hamburger&#34; .substring(4,8)返回&#34;敦促&#34; (不是&#34;督促&#34;)
&#34;微笑&#34; .substring(1,5)返回&#34;英里&#34; (不是&#34;里程&#34;)
希望这有帮助。