Java String.intern()

LittleSkey發表於2020-11-06

當呼叫intern方法時,如果常量池中已經存在該字串,則返回池中的字串;否則將此字串新增到常量池中,並返回字串的引用。

作用

1、重用String物件,以節省記憶體消耗。

2、多次比較字串值時,intern()後字串可以直接 == 進行比較。比equals()要快

舉個例子

class Test {
    public static void main(String args[]) {
        String s1 = new StringBuilder().append("String").append("Test").toString();
        System.out.println(s1.intern() == s1);

        String s2 = new StringBuilder().append("ja").append("va").toString();
        System.out.println(s2.intern() == s2);
    }
}

1、JDK6的執行結果:false false

在JDK6中,常量池在永久代分配記憶體,永久代和Java堆的記憶體是物理隔離的,執行intern方法時,如果常量池不存在該字串,虛擬機器會在常量池中複製該字串,並返回引用,所以需要謹慎使用intern方法,避免常量池中字串過多,導致效能變慢,甚至發生PermGen記憶體溢位

                                                  

2、JDK8的執行結果:true false

在JDK8中,常量池已經在Java堆上分配記憶體,執行intern方法時,如果常量池已經存在該字串,則直接返回字串引用,否則複製該字串物件的引用到常量池中並返回,所以在JDK7中,可以重新考慮使用intern方法,減少String物件所佔的記憶體空間

                                                      

對於變數s1,常量池中沒有 "StringTest" 字串,s1.intern() 和 s1都是指向Java物件上的String物件。
對於變數s2,常量池中一開始就已經存在 "java" 字串(為什麼一開始就有,可以閱讀《深入理解java虛擬機器》String.intern()探究),所以 s2.intern() 返回常量池中 "java" 字串的引用。

參考文章

淺談Java String.intern()

java中String.intern() 方法到底是幹啥的?

擴充閱讀

深入解析String#intern

Java字串池(String Pool)深度解析

相關文章