Java String類爲何是final的?

答:1.爲了實現字符串池數據庫

        2.爲了線程安全編程

        3.爲了實現String能夠建立HashCode不可變性數組

    首先你要理解final的用途,在分析String爲何要用final修飾,final能夠修飾類,方法和變量,而且被修飾的類或方法,被final修飾的類不能被繼承,即它不能擁有本身的子類,被final修飾的方法不能被重寫, final修飾的變量,不管是類屬性、對象屬性、形參仍是局部變量,都須要進行初始化操做。緩存

在瞭解final的用途後,在看String爲何要被final修飾:主要是爲了」安全性「和」效率「的緣故。安全

查看JDK String的源碼多線程

final修飾的String,表明了String的不可繼承性,final修飾的char[]表明了被存儲的數據不可更改性。可是:雖然final表明了不可變,但僅僅是引用地址不可變,並不表明了數組自己不會變,請看下面圖片。socket

 

    final也能夠將數組自己改變的,這個時候,起做用的還有private,正是由於二者保證了String的不可變性。線程

    那麼爲何保證String不可變呢,由於只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現能夠在運行時節約不少heap空間,由於不一樣的字符串變量都指向池中的同一個字符串。但若是字符串是可變的,那麼String interning將不能實現,由於這樣的話,若是變量改變了它的值,那麼其它指向這個值的變量的值也會一塊兒改變。對象


    若是字符串是可變的,那麼會引發很嚴重的安全問題。譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來得到數據庫的鏈接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。由於字符串是不可變的,因此它的值是不可改變的,不然黑客們能夠鑽到空子,改變字符串指向的對象的值,形成安全漏洞。blog


    由於字符串是不可變的,因此是多線程安全的,同一個字符串實例能夠被多個線程共享。這樣便不用由於線程安全問題而使用同步。字符串本身即是線程安全的。


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

做者:星期三不上班 連接:https://www.jianshu.com/p/9c7f5daac283 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索