String split方法實現過程圖解
這篇文章主要介紹了String split方法實現過程圖解,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
String的split方法相信大家都不陌生,或多或少都用過它將字串轉成一個數組,但是就是這樣一個簡單的方法,裡面也有一個不得不注意、不深不淺的小坑。
本地測試程式碼如下圖所示:
圖1
大家會發現split1跟split3的長度符合我們的預期,但是split2應該是長度為5,但實際長度卻仍然為4。相信大家在遇到這種情況的時候,
應該能立馬猜到String的這個split方法應該不只是進行一個匹配拆分的操作,還做了其他的邏輯處理,比如這裡應該做了去除最後一個空元素
的操作。既然有了這樣的猜想,那就繼續看看原始碼尋根溯源一下吧。
圖2
該方法呼叫了一個過載的方法,第一個引數沒變,第二個引數limit傳了0,繼續追溯
圖3
卻發現有點頭大,比較麻煩,完全看不下去了。
換個思路,debug一下,看看這最後一個空的元素是在哪裡被過濾掉的,一試果然發現了案發地。
圖4
此處的list裡存放的是全部的5個元素,而在下面的while迴圈裡,可以看到是從尾部往前遍歷看哪個元素長度為0,
有一個為0的就減一個長度,直到碰到第一個不為空的元素為止。進行完這個while迴圈之後,就擷取前面的元素,
轉成陣列返回。
通過以上的簡要分析,即可知道,對於String的split方法,如果字串末尾剛好是匹配字元,則會自動將最後一個
空元素去掉,而字串首部有空元素則不受影響。
多說兩句,其實對於limit引數,測試幾次便可發現,此引數是限制返回的資料最大長度的。測試程式碼如下:
圖5
可知傳了limit值,就不會自動去掉末尾的空元素。具體原因可見圖4原始碼,如果limit不為0,則不會走if中的while迴圈,也就不會出現上文中說的情況了。
對於這種坑,沒什麼避免的好辦法,一是擴大自己的知識面,二是多積累總結。加油吧!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。