[英]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.