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")

希望对您有所帮助。