首先String這個類被final關鍵字修飾
所以String是個常量,在它被創建的那一刻起它的值就不會改變了
關於String的一道經典面試題:
public class demo { public static void main(String[] args) { String a = "abc"; String b = "abc"; String c = new String("abc"); System.out.println(a==b); //true System.out.println(a.equals(b)); //true System.out.println(a==c); //false System.out.println(a.equals(c)); //true } }
其中涉及到String的兩種構造方法:
1.String a = "abc";
直接賦值方式創建對象(在方法區的常量池)
2.String c = new String("abc");
通過構造方法創建對象(在堆內存)
關於題目的圖解:
分析:因爲String太過常用,JAVA類庫的設計者在實現時做了個小小的變化,即採用了享元模式(後面會介紹),每當生成一個新內容的字符串時,他們都被添加到一個共享池中,當第二次再次生成同樣內容的字符串實例時,就共享此對象,而不是創建一個新對象,但是這樣的做法僅僅適合於通過=符號進行的初始化。
需要說明一點的是,在object中,equals()是用來比較內存地址的,但是String重寫了equals()方法,用來比較內容的,即使是不同地址,只要內容一致,也會返回true,這也就是爲什麼a.equals(c )返回true的原因了。
亨元模式
其實字符串常量池這個問題涉及到一個設計模式,叫「享元模式」,顧名思義 - - - > 共享元素模式
也就是說:一個系統中如果有多處用到了相同的一個元素,那麼我們應該只存儲一份此元素,而讓所有地方都引用這一個元素
Java中String部分就是根據享元模式設計的,而那個存儲元素的地方就叫做「字符串常量池 - String Pool」
想了解更多String類的知識請閱讀
https://www.cnblogs.com/zhangyinhua/p/7689974.html#_label3