1
將方法或類聲明為final主要目的是:確保它們不會在子類中改變語義。String類是final類,這意味着不允許任何人定義String的子類。
String基本約定中最重要的一條是immutable。
但是假如String沒有聲明為final, 那么你的StringChilld(聲明為final就不可被繼承)就有可能是被復寫為mutable的,這樣就打破了成為共識的基本約定。
2
String源碼前幾行
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
- String類用final關鍵字修飾,說明String不可繼承。
- 字段value 是char【】數組,用final修飾,說明value這個引用地址不可變,但是Array數組是可變的。
棧指針不可變,但是堆上的數據本體可以變。

3 不可變有什么好處
- 安全:多線程下對資源做寫操作有危險。不可變對象不能被寫,所以線程安全。
- 可以共用一個實例(在多線程中共享一個不可變對象而不用擔心線程安全問題):當代碼中出現字面量形式創建字符串對象時,JVM首先會對這個字面量進行檢查,如果字符串常量池中存在相同內容的字符串對象的引用,則將這個引用返回,否則新的字符串對象被創建,然后將這個引用放入字符串常量池,並返回該引用。String one = “someString”;String two = “someString”,都用字面量“someString賦值”,他們其實都指向同一個內存地址。當代碼中出現字面量形式創建字符串對象時,JVM首先會對這個字面量進行檢查,如果字符串常量池中存在相同內容的字符串對象的引用,則將這個引用返回,否則新的字符串對象被創建,然后將這個引用放入字符串常量池,並返回該引用。(PS:運行時常量池是方法區的一部分,用於存放各種字面量和符號引用)
- String是幾乎每個類都會使用的類,特別是作為Hashmap之類的集合的key值時候,mutable的String有非常大的風險。