Java String split() 方法的奇怪行为
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() 方法的行为是这样的?有人可以给我适当的解释吗?
one-argument split
method 行为的一个方面可能令人惊讶——从返回的数组中丢弃尾随空值。
Trailing empty strings are therefore not included in the resulting array.
要为每种情况获得 2
的长度,您可以将负的第二个参数传递给 two-argument split
method,这意味着长度不受限制,并且不会丢弃尾随的空字符串。
看看文档就知道了:
Trailing empty strings are therefore not included in the resulting
array.
所以在情况 1 中,输出将是 {"abc", ""}
但 Java 会剪切尾随的空字符串。
如果您不想丢弃尾随的空字符串,则必须使用 split("#", -1)
.
观察到的行为是由于 substring() 方法在 Java:
中固有的不对称性
这是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()方法的行为:
来自 Java文档:
String java.lang.String.substring(int beginIndex, int endIndex)
Returns a new string that is a substring of this string. The substring
begins at the specified beginIndex and extends to the character at index
endIndex - 1. Thus the length of the substring is endIndex-beginIndex.
Examples:
"hamburger".substring(4, 8) returns "urge" (not "urger")
"smiles".substring(1, 5) returns "mile" (not "miles")
希望对您有所帮助。
我有一个方法,它接受一个字符串参数并用 # 拆分字符串,拆分后打印数组的长度以及数组元素。下面是我的代码
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() 方法的行为是这样的?有人可以给我适当的解释吗?
one-argument split
method 行为的一个方面可能令人惊讶——从返回的数组中丢弃尾随空值。
Trailing empty strings are therefore not included in the resulting array.
要为每种情况获得 2
的长度,您可以将负的第二个参数传递给 two-argument split
method,这意味着长度不受限制,并且不会丢弃尾随的空字符串。
看看文档就知道了:
Trailing empty strings are therefore not included in the resulting array.
所以在情况 1 中,输出将是 {"abc", ""}
但 Java 会剪切尾随的空字符串。
如果您不想丢弃尾随的空字符串,则必须使用 split("#", -1)
.
观察到的行为是由于 substring() 方法在 Java:
中固有的不对称性这是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()方法的行为:
来自 Java文档:
String java.lang.String.substring(int beginIndex, int endIndex)
Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.
Examples:
"hamburger".substring(4, 8) returns "urge" (not "urger")
"smiles".substring(1, 5) returns "mile" (not "miles")
希望对您有所帮助。