字符串截取是大家在開發過程中經常會用到的一個功能。要實現這個功能就會用到String類的substring方法。
那大家知道這個substring是怎麼實現的這個功能呢。
今天我們就來一探究竟。
我本機安裝的是java8。先看看java8的源碼裡,這個substring有什麼秘密吧。
我們可以看到在substring方法中先是進行一系列的驗證校驗,然後調用了new String新實例化一個對象。
在對應的構造方法中從原字符串對象的value屬性(char數組)複製出指定範圍的數據作為新字符串對象的value屬性。
可是你知道嗎?
這個substring並不是從來就是這樣的,在java6時它還是另外一副面孔哦。
上圖是java6中substring的部分代碼邏輯(因為下載java6的源碼幾次都沒有下載成功,沒辦法上java6的源碼圖了,後續下載成功後,我會把源碼圖粘貼到評論區,有興趣的朋友也可以自己去翻閱一下java6的源碼)。
可以看出來java6中的substring和我上面貼的java8中的是完全不一樣的。
java6之後的substring為什麼要做這樣的修改呢。
那是因為java6中那樣的邏輯是有問題的。
java6中截取後的字符串和原字符串公用了char數組。
比如從一個很長的字符串中截取很短的部分內容使用,即便原字符串在後面已經不再使用,但是因為截取後的字符串依舊引用了原字符串的數組。那這個只用了部分內容的很長的字符串數組就會很長時間不會被回收。
這樣就會造成資源的浪費,甚至可能會導致內存洩露。
今天算是扒了扒substring的前世今生了。