JAVA 常量池
阿新 • • 發佈:2020-12-19
技術標籤: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一樣,但是字串不存在時不再需要重新建立例項,可以直接指向堆上的例項。