Java String split()方法的奇怪行为

时间:2015-03-25 21:29:26

标签: java string split

我有一个方法,它接受一个字符串参数并用#分割字符串,并在分割后打印出数组的长度以及数组元素。以下是我的代码

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()方法的行为是这样的?有人能给我正确的解释吗?

3 个答案:

答案 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;)

希望这有帮助。