繁体   English   中英

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()方法的行为如此? 有人可以给我适当的解释吗?

参数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM