String a = new String("helloJava");
String a1 = a.intern();
System.out.println(a == a1);//false
String b = new String("String")+new String("Tests");
String b1 = b.intern();
System.out.println(b == b1);//true
這兩個例子結果不一致 ,是不是因為 new String(“helloJava”)這步以后,就會把helloJava字面量自動放入常量池一份,所以后邊的intern()能夠拿到常量池的參考,也就是a1,而a只是堆中參考,所以false?
而例子二b最終物件StringTests只在堆中,不在常量池,所以intern()回傳的還是堆中物件,所以 true?
是這么理解么大神們,求指教,謝謝。
哪里理解錯了希望大神不吝賜教!
uj5u.com熱心網友回復:
首先對于 String a = new String("helloJava") 來說,“helloJava”會被放入常量池,然后用這個常量池物件在堆中初始化一個新的物件賦給a,所以a和常量池的物件是不一樣的
其次
String a1 = a.intern(); 對于intern方法來說(可以參考doc檔案),如果常量池不存在,則把a放到常量池,并回傳常量池的參考賦給a1。由于常量池已經存在了“helloJava”(上一條陳述句),所以intern沒有把a放到常量池,而是直接回傳“helloJava”的參考,所以a1參考常量物件,a參考堆物件
所以a==a1是false
對于String b = new String("String")+new String("Tests");常量池放入“String”和“Tests”兩個物件,但是“StringTests”沒有放入常量池(因為沒有一個常量是“StringTests”,它只是變數相加的結果,所以不會放入常量池),而是在堆中生成“StringTests”物件,讓b參考該物件
所以
String b1 = b.intern(); 這里的intern方法發現常量池中沒有“StringTests”,于是就把b放入常量池(此時b就相當于參考常量池的物件,因為自己被放到了常量池),然后把常量池物件的參考賦給b1(此時b1也是參考常量池的物件),b和b1都是參考常量池的物件,
所以b==b1就是true
所以,intern是否會把物件放入常量池,覺得在呼叫intern之前常量池是否已經有了相同的物件,如果有,那就不放,即原來堆中的物件還是堆中,和常量池的物件不相干,==為false;如果沒有,那就把堆中的物件放入常量池,所以堆中的物件變成了常量池的物件,所以==就是true
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/192809.html
標籤:Java EE
