JVM_字串常量池地址問題
阿新 • • 發佈:2022-05-17
先看下程式碼
public class JVMDemo { public static void main(String[] args) { String s1 = "ab"; //new String() -> jdk1.8後永遠指向常量池中的引用(沒有就在常量池中建立,不會把s2複製到常量池(區別jdk1.6)) String s2 = new String("ab"); String s3 = new String("a") + new String("b"); String s4 = "a"; String s5 = "b"; String s6 = s4 + s5; String s7 = "a" + "b"; String s8 = s4 + "b"; System.out.println(s1 == s2);//false System.out.println(s1 == s3);//false System.out.println(s1 == s6);//false System.out.println(s1 == s7);//true System.out.println(s1 == s8);//false System.out.println(s2 == s6);//false System.out.println(s2 == s7);//false System.out.println(s2 == s8);//false System.out.println(s2.intern() == s3.intern());//true System.out.println(s2.intern() == s6.intern());//true System.out.println(s2.intern() == s8.intern());//true System.out.println(s2.intern() == s1);//true System.out.println(s2.intern() == s7);//true } }
1、s1為字串常量,取自常量池中,所有取自常量池中相等的值最終地址都相等。(在jdk1.7之後常量池放在了堆中)
所有字面量字串均存放在常量池中,一旦有變數的加入,則會在堆中建立物件。
2、String s8 = s4 + "b"
中的+
到底做了什麼
new StringBuilder(s4).append("b").toString()
3、String.intern()的作用是什麼
String.intern() --> 返回一個字串,內容與此字串相同,若常量池裡有相同字串則返回池中字串的引用,若沒有則將其複製一份新增進池中再返回池中字串的引用。
4、String s2 = new String("ab");
做了什麼
jdk1.6中:先判斷常量池中是否有"helloworld",如果有直接返回常量池中的地址,如果沒有則拷貝一份s2物件放入常量池(此時,new String仍指向原來堆中的地址)
jdk1.8中:先判斷常量池中是否有"helloworld",如果有直接返回常量池中的地址,如果沒有則將該物件放入常量池中。(此時,new String已經指向了常量池中的helloworld的地址)