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變更一下又會產生什麼結果呢?以下代碼所示:>>>>閱讀全文變量