Java中的String真的是不可變的嗎?
首先,Java中的String物件一旦被建立就具備不可修改的特性,對String物件的任何操作都不能改變原來String的值,任何改變的操作都會產生一個新的物件。為了驗證這個特性,我們來看一個小實驗:
通過這個實驗我們會發現一個問題,就是對字串String的任何操作(改變大小寫、替換等)都不會影響字串物件hello本來的值,但是這些更改的操作會產生一個新的物件,新的物件確實擁有了修改後的新值。
String類還有一個非常重要的特徵,就是String類是final修飾的,也就是我們通常所說的“最終類”,這說明String類放棄了擁有子類的權利,看一下Java官方文件(jdk9)對String類的描述:
通過這個描述可以清晰的看到String類的定義是final的。
其實,Java中的String類雖然看似簡單明瞭,但是關於String的內容遠比看起來的要複雜的多,因為String涉及到了JVM中三個關鍵的概念,分別是“常量池”、“棧”和“堆”。由於String類的頻繁使用會佔用大量的時間(空間),所以JVM為String類建立了一個存放字串的“常量池”,池中存放了大量的字串常量。為了理解這個字串常量池,我們可以看一個簡單的實驗:
通過這個實驗我們可以看出,兩個物件StringA和StringB是指向同一個字串常量,所以他們對比的返回值是true。接著看下面這個例子:
這個例子卻返回了截然不同的結果,原因在於new每次會建立一個新的物件,所以對比的結果是false(關於這個解釋其實可以描述的非常複雜,這裡就略了)。
關於String的內容雖然看似簡單,實則比較複雜,我們能通過String類來解釋很多JVM的執行機制,所以String類是一個值得深究的類。
我使用Java語言多年,我也出版過關於Java程式設計的書籍,我會陸續在頭條上寫一些關於Java方面的文章,感興趣的朋友可以關注我的頭條號,相信一定會有所收穫。
如果有Java方面的問題,也可以諮詢我。
謝謝!