前幾天看到同事代碼裏有類似如下這樣一行代碼:
String[] testStrs3 = testStr3.split(",", -1);
因爲之前使用split()方法沒有加過第二個參數,所以對此進行了學習,在此做個總結與分享。
1.代碼示例
先來看一段測試代碼:
public class Test {
public static void main(String[] args) {
String testStr = ",aa,bb,cc,";
//情形1: split(String)
String[] testStrs1 = testStr.split(",");
printArray(testStrs1, 1);
//情形2: split(String, int)
String[] testStrs2 = testStr.split(",", 0);
printArray(testStrs2, 2);
//情形3: split(String, int)
String[] testStrs3 = testStr.split(",", -1);
printArray(testStrs3, 3);
//情形4: split(String, int)
String[] testStrs4 = testStr.split(",", 2);
printArray(testStrs4, 4);
}
private static void printArray(String[] testStrs, int index) {
System.out.println("情形[" + index + "]打印開始");
for (String str : testStrs) {
System.out.println(str);
}
System.out.println("情形[" + index + "]打印結束");
System.out.println();
}
}
運行結果:
情形[1]打印開始
aa
bb
cc
情形[1]打印結束
情形[2]打印開始
aa
bb
cc
情形[2]打印結束
情形[3]打印開始
aa
bb
cc
情形[3]打印結束
情形[4]打印開始
aa,bb,cc,
情形[4]打印結束
從打印結果來看,同一個字符串,使用同一個方法split()來分割,但結果差異還是比較大的,下面分析一下split()的第二個int類型參數的作用。
2.方法解析
在String類中,split()方法有兩種實現,方法簽名如下:
public String[] split(String regex);
public String[] split(String regex, int limit);
從源碼中可以看到,其實第一個方法是基於第二個方法實現的,只是limit參數默認爲0
public String[] split(String regex) {
return split(regex, 0);
}
所以,上面提出的問題就可以歸結到limit參數了。下面是split()方法註釋中對limit參數的說明:
可以看到:
- 當limit>0時,字符串最多會被分割limit-1次,即最後得到長度爲limit的數組。如果字符串包含多於limit-1個分隔符,那麼從第limit-1個分隔符到最後的子字符串將被當成一個字符串放到分割後的字符串數組的最後;
- 當limit>0時,字符串會被分割儘可能多的次數;
- 當limit=0時,字符串也將被分割成儘可能多的次數,不同的是最後的空字符串會被丟棄。
看到上面註解後,也就明白上面代碼打印不同結果的原因了。情形1和情形2其實同屬於limit爲0的情況,所以分割後最後的空字符串被丟棄,但是第一個空字符串會保留;情形3爲limit小於0的情況,所以最後的空字符串也不會被丟棄;情形4是limit大於0的情況,所以字符串只被分割了limit-1即2-1=1次,最後得到的字符串數組之後兩個元素。
3.提醒
當對於一個空字符串進行分割時,不管limit參數爲何,最後結果都是得到一個只包含一個空字符串的(長度爲1)的字符串數組,這個有時候需要注意。
4.結語
以上內容如有錯誤之處,敬請指正,不勝感激。