Java面試基礎篇——第二篇:String類能爲何不能被繼承?

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

}

String類有final修飾符,而final修飾的類是不容許被繼承的,實現的細節也沒法改變。java

String類爲什麼被設計爲不能繼承?

1.帶有 final 修飾符的類是不可派生的。 如 java.lang.String, 爲 String 類指定 final 防止了人們覆蓋 length() 方法。sql

2.若是指定一個類爲 final,則該類全部的方法都是 final。 java 編譯器會尋找機會內聯(inline)全部的 final 方法。數據庫

3.由於字符串是不可變的,因此是多線程安全的,同一個字符串實例能夠被多個線程共享緩存

4.類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個值被改爲了myhacked.Connection,那麼會對你的數據庫形成不可知的破壞。安全

5.由於字符串是不可變的,因此在它建立的時候hashcode就被緩存了,不須要從新計算。這就使得字符串很適合做爲Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵每每都使用字符串。多線程

6.當字符串是不可變時,字符串池纔有可能實現。字符串池的實現能夠在運行時節約不少heap空間,由於不一樣的字符串變量都指向池中的同一個字符串。但若是字符串是可變的,那麼String interning將不能實現(String interning是指對不一樣的字符串僅僅只保存一個,即不會保存多個相同的字符串。),由於這樣的話,若是變量改變了它的值,那麼其它指向這個值的變量的值也會一塊兒改變。線程

相關文章
相關標籤/搜索