天天看點

java:源碼解讀String類的不可變特性

String類不可變的含義

String對象建立之後便不會再改變,任何看起來的變化都是通過建立新的String對象來完成的。

舉例:

String a = new String("abc");
a = a + "d";
           

第一個語句建立了一個String 對象abc,a是指向這個對象的引用

第二個語句右邊建立了另外一個String對象abcd;

執行第二個語句時,并不會修改原先的對象abc;

java:源碼解讀String類的不可變特性

不可變是如何實作的

這裡有三個關鍵點:

1、String類被final修飾,不可被繼承;因為一旦允許繼承的化,那麼方法就有可能被重寫,也就有可能會破壞不可變性,這就是為什麼用final修飾的原因;

2、private final修飾char[] 數組;字元串底層使用字元數組來存儲,這個字元數組通過private final修飾,防止外部對字元串做出改變;

3、String類種的任何方法都不會對字元串進行改動;

java:源碼解讀String類的不可變特性

為什麼設計為不可變的

主要還是為了性能方面的考慮,因為在java語言設計之初,就認為String将會被頻繁的使用,是以設定了常量池,目的是為了盡可能的複用已有對象,這就要求已有對象是不可變的;

java:源碼解讀String類的不可變特性

當然設計成不可變對象,一定程度上也可以增加代碼的安全性,比如可變對象作為hashMap的key時,如果先放入map之後,再改變對象,那麼可能就會破壞Map對key的唯一性要求;

零基礎學習Java程式設計,可以加入我的十年Java學習園地。技術交流,資源共享,解疑答惑,經驗分下。