String的split方法相信你們都不陌生,或多或少都用過它將字符串轉成一個數組,可是就是這樣一個簡單的方法,裏面也有一個不得不注意、不深不淺的小坑。數組
本地測試代碼以下圖所示:測試
圖1debug
你們會發現split1跟split3的長度符合咱們的預期,可是split2應該是長度爲5,但實際長度卻仍然爲4。相信你們在遇到這種狀況的時候,blog
應該能立馬猜到String的這個split方法應該不僅是進行一個匹配拆分的操做,還作了其餘的邏輯處理,好比這裏應該作了去除最後一個空元素字符串
的操做。既然有了這樣的猜測,那就繼續看看源碼尋根溯源一下吧。源碼
圖2it
該方法調用了一個重載的方法,第一個參數沒變,第二個參數limit傳了0,繼續追溯循環
圖3遍歷
卻發現有點頭大,比較麻煩,徹底看不下去了。bug
換個思路,debug一下,看看這最後一個空的元素是在哪裏被過濾掉的,一試果真發現了案發地。
圖4
此處的list裏存放的是所有的5個元素,而在下面的while循環裏,能夠看到是從尾部往前遍歷看哪一個元素長度爲0,
有一個爲0的就減一個長度,直到碰到第一個不爲空的元素爲止。進行完這個while循環以後,就截取前面的元素,
轉成數組返回。
經過以上的簡要分析,便可知道,對於String的split方法,若是字符串末尾恰好是匹配字符,則會自動將最後一個
空元素去掉,而字符串首部有空元素則不受影響。
多說兩句,其實對於limit參數,測試幾回即可發現,此參數是限制返回的數據最大長度的。測試代碼以下:
圖5
可知傳了limit值,就不會自動去掉末尾的空元素。具體緣由可見圖4源碼,若是limit不爲0,則不會走if中的while循環,也就不會出現上文中說的狀況了。
對於這種坑,沒什麼避免的好辦法,一是擴大本身的知識面,二是多積累總結。加油吧!