簡體   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