hello 大家好,好久不見,今天 我們要討論的是java的split方法,或許你很早就知道了,但你真的知道嗎?
我們來看看吧。
首先我們來看看我們最常用的split()方法也就是單個參數的方法
public String[] split(String regex) { return split(regex, 0); }
卧槽,這不是重載方法嘛,調用的是另外一個方法,而且還給了個默認值0,然后我們來看看重載的哪個方法
public String[] split(String regex, int limit) { // Try fast splitting without allocating Pattern object String[] fast = Pattern.fastSplit(regex, this,limit); if (fast != null) { return fast; } return Pattern.compile(regex).split(this, limit); }
???這一串啥東西,不管了,既然這個方法的重載到此,我們就看看這個最底層的方法怎么用的吧
int limit?這是啥?以下為API解釋
limit 參數控制模式應用的次數,因此影響所得數組的長度。如果該限制 n 大於 0,則模式將被最多應用 n - 1 次,數組的長度將不會大於 n,而且數組的最后一項將包含所有超出最后匹配的定界符的輸入。如果 n 為非正,那么模式將被應用盡可能多的次數,而且數組可以是任何長度。如果 n 為 0,那么模式將被應用盡可能多的次數,數組可以是任何長度,並且結尾空字符串將被丟棄。
是不是有點活在自己世界的說法,沒辦法自己來試唄。
注意:下面的測試請注意測試字符串的變化
1.默認方法測試,上面的代碼可以看出,默認方法limit只是傳的0而已。
廢話不說,我們來上手測試 (注意我們的測試字符串最后一個逗號后面是空的)
String str = "1,2,4,5,6,7,"; String[] strArr = str.split(","); for(String s: strArr){ System.out.println("分割:"+s); } System.out.println("數組長度:" + strArr.length);
輸出結果:
分割:1 分割:2 分割:4 分割:5 分割:6 分割:7 數組長度:6
測試結果:按照理論分割的話,那么最后一個“,”后面的空不是也應該也被分割出來嘛,但是發現測試結果最后一個空格被去掉了,那么是省去了嗎?
1.去掉最后一個空格不分割。
既然這樣,那我拿多個空格在后面能去掉嗎?
來測試
String str = "1,2,4,5,6,7,,,"; String[] strArr = str.split(","); for(String s: strArr){ System.out.println("分割:"+s); } System.out.println("數組長度:" + strArr.length);
輸出結果:
分割:1 分割:2 分割:4 分割:5 分割:6 分割:7 數組長度:6
測試結果:看來limit為0 時 分割的最后如果是空格,那么無論多少個空格都會被去掉
其他猜想:1.若中間出現空格會去掉嗎? (如: 1,2,3,,4,5,6,7)
2.若開頭出現空格會去掉嗎? (如:,,1,2,3,4,5,6,7)
我就不貼代碼了:1.中間的不會去掉空格,空格也會作為一個字符串存入分割后的數組中。
2.開頭的空格也不會去掉,也做保留。
結論:當limit == 0 時,只有存在最后的空格會被去掉,其他的在中間和前面的都不會被去掉。
2.當limit > 0時 測試開始。
String str = "1,2,4,5,6,7"; String[] strArr = str.split(",",5); for(String s: strArr){ System.out.println("分割:"+s); } System.out.println("數組長度:" + strArr.length);
輸出結果
分割:1 分割:2 分割:4 分割:5 分割:6,7 數組長度:5
What ? 最后一個分割冒出了一個 "6,7" ?????啥玩意啊?
別急我們來看,這里的分割的個數是不是等於limit的填的數量?
果然 limit 等於 分割個數 那這個就簡單了
測試結果:limit等於你要分割的份數。
其他猜想:1.如果limit > 最大分割的份數(比如 “1,2,3,4,5,6,7”最大的分割其實是7份,大於最大分割也就是大於7)會怎么樣呢?
2.如果limit 是小數怎么辦?
結論:1.如果大於也只會按照最大的分割數分割。
2.limit是整型,不能使用小數
2.當limit < 0時 測試開始。
String str = "1,2,4,5,6,7,"; String[] strArr = str.split(",",-1); for(String s: strArr){ System.out.println("分割:"+s); } System.out.println("數組長度:" + strArr.length);
輸出結果:
分割:1 分割:2 分割:4 分割:5 分割:6 分割:7 分割: 數組長度:7
哈哈看到了有意思的了,最后一個空格他沒有屏蔽
后面也不買關子了
結論:如果limit為負數,就不會去掉任何分割后的字符,至於 -1 和-2 有什么區別,我現在還不能了解。