淺談java String類中的intern方法

對於java 字符串String的認識,相信你們都接觸過也使用過,可是怎麼使用它,如何去使用好它又是另一回事了,好了,言歸正傳,今天聽之前的同事說,字符串intern方法,我當時以爲這個是什麼?沒用過,後來百度一下這個,才知道它的做用是強制讓JAVA虛擬機去常量池匹配這個值,常量池咱們都知道是存在於方法區的,它是方法區的一部分,而方法區是線程共享的,因此常量池也就是線程共享的,可是它並非線程不安全的,它實際上是線程安全的,他僅僅是讓有相同值的引用指向同一個位置而已,若是引用值變化了,可是常量池中沒有新的值,那麼就會新開闢一個常量結果來交給新的引用。java

這樣說大家可能會有一點懵,我舉個例子安全

String strA = "helloWord";
    String strB = "hello";
    String strC = "Word";
    String strD = strB + strC;

 若是我不用字符串中的tntern方法,拿strA==strD來比較是否同一個對象,結果咱們都知道,false,由於JVM在編譯程序時,會將編譯過程當中對字面量計算的表達式先行計算,將結果替換表達式。只要有一方不是字面量,就不會編譯計算,由於JVM不明確它是什麼,這樣解釋應該都清晰明瞭吧?因爲strD的表達式右邊不是字面量,而致使跟strA不是同一個對象,當我這樣編寫時。線程

String strA = "helloWord";
    String strB = "hello";
    String strC = "Word";
    String strD = strB + strC;
    boolean compareResult = strA == strD.intern();

結果將爲true,同一個對象,爲何我頻繁說對象,對象,大家能聯想到什麼?線程鎖,鎖的對象必須是同一個對象,當你要拿一個字符串做爲鎖的對象,拿必需要確保這個對象是同一個,當你須要用字符串拼接這個鎖對象時,使用到一些字面量是hard core + 表達式造成的結果跟常量池存在的值同樣時,但又不是同一個對象,這個時候咱們能夠用intern,而且減小方法區的開闢空間。code

相關文章
相關標籤/搜索