1. 程式人生 > 其它 >JAVA 常量池

JAVA 常量池

技術標籤:JVM

常量池分類: 靜態常量池、執行時常量池

  • 靜態常量池 存在於class檔案中,包含類定義,屬性,方法
  • 執行時常量池 JVM完成類載入後,將class載入入記憶體後儲存在方法區,即平常說的常量池就是執行時常量池

字串池1.7之後從方法區移到了堆區

String s1 = new String("he") + new String("llo");
String s2 = s1.intern();

System.out.println(s1 == s2);
// 在 JDK 1.6 下輸出是 false
// 在 JDK 1.7 之後的版本輸出是 true

在 JDK 1.6 中,呼叫intern()首先會在字串池中尋找equal()相等的字串,假如字串存在就返回該字串在字串池中的引用;假如字串不存在,虛擬機器會重新在永久代上建立一個例項,將 StringTable 的一個表項指向這個新建立的例項

所以上圖中JDK1.6 s1.intern產生的物件在方法區中,而s1物件在堆中,故輸出false

在 JDK 1.7 中,由於字串池不在永久代了,intern()做了一些修改,更方便地利用堆中的物件。字串存在時和 JDK 1.6一樣,但是字串不存在時不再需要重新建立例項,可以直接指向堆上的例項。