String類需要注意的幾個點

首先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