1 String str2 = new String("abc")+new String("01");
2 str2.intern();
3 String str1 = "abc01";
4 System.out.println(str2==str1);
今天忽然又蒙了 這個為啥是true啊
第一步 堆上一個str2物件 abc01
第二步 池中放入一個abc01 str2不變
第三步 str1 參考常量池abc01
結果不應該是 堆上 == 池上 false嗎?! 咋回是true呢。。
求大神指教。。
uj5u.com熱心網友回復:
intern方法的檔案說明已經解釋得很清楚了,池中不存在物件的時候,就把物件放入池中,并回傳該物件的參考所以
str2.intern時,abc01被放入池中,并回傳str2(因為str2就是abc01的參考)
所以第二步理解有問題
池中放入abc01時,str2也變為指向池中的abc01物件
所以str1和str2都指向池中的abc01物件,所以==是true
uj5u.com熱心網友回復:
大佬 感謝您回復! 我這塊兒老是想不明白。。“str2.intern();”是說這一步過后,str2就不參考最初堆上的那個abc01了, 而是參考常量池中的abc01了么?或者說str2和abc01本身已經變為常量池里的了。。
uj5u.com熱心網友回復:
str2指向常量池的物件,堆的物件移到常量池了,參考不跟著變,那參考不就變成指向空了嗎?str2本身就在堆疊里,它不會變成常量池的東西的。uj5u.com熱心網友回復:
了解了,str2.intern(),堆的物件移到常量池,所以str2參考的物件由堆中物件變為了參考常量池的abc01。
感謝大佬!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/208514.html
標籤:Java EE
