String被final修飾
從 String 類的源碼我們可以看出 String 是被 final 修飾的不可繼承類,源碼如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence { ...... }
那這樣設計有什么好處呢?
Java 語言之父 James Gosling 的回答是,他會更傾向於使用
final,因為它能夠緩存結果,當你在傳參時不需要考慮誰會修改它的值;如果是可變類的話,則有可能需要重新拷貝出來一個新值進行傳參,這樣在性能上就會有一定的損失。
James Gosling 還說:迫使 String
類設計成不可變的另一個原因是安全,當你在調用其他方法時,比如調用一些系統級操作指令之前,可能會有一系列校驗,如果是可變類的話,可能在你校驗過后,它的內部的值又被改變了,這樣有可能會引起嚴重的系統崩潰問題,這是迫使
String 類設計成不可變類的一個重要原因。
總結來說,使用 final 修飾的第一個好處是安全;第二個好處是高效,以 JVM 中的字符串常量池來舉例,如下兩個變量:
String s1 = "java";
String s2 = "java";
只有字符串是不可變時,我們才能實現字符串常量池,字符串常量池可以為我們緩存字符串,提高程序的運行效率,如下圖所示:
試想一下如果 String 是可變的,那當 s1 的值修改之后,s2 的值也跟着改變了,這樣就和我們預期的結果不相符了,因此也就沒有辦法實現字符串常量池的功能了。