JVM筆記3-java內存區域之運行時常量池

1.運行時常量池屬於線程共享區中的方法區。java

2.運行時常量池用於編譯期生成的各類自變量,符號引用,這部份內用將在類加載後接入方法區的運行時常量池中存放。數據結構

 

看以下代碼所示,如圖:線程

 

public class Test {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";

        String s3 = new String("abc");
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
    }
}

很明顯s1 == s2爲true,而s1 == s3爲false。對象

由於基本數據類型和抽象數據類的引用是放在棧幀的局部變量表中。因此s1 s2是放在棧幀的局部變量表中。而「abc」這個對象則是放在運行時常量池中。get

而這個常量池有鍾數據結構叫Stringtable,它的數據類型能夠理解爲HashSet。而HashSet是無序的,不可重複的。所以第一次將定義的「abc"放入其中編譯

而第二次定義中發現常量池中有「abc」了,則再也不建立「abc"了,此時s1 和s2則引用的是同一個」abc「。所以s1 == s2爲true。table

而s3則是經過new出來的實例,則放進java堆中,此時s3引用的是堆中的」abc"。所以s1 == s3爲false。class

 

若是將s3變更一下又會產生什麼結果呢?以下代碼所示:>>>>閱讀全文變量

相關文章
相關標籤/搜索