有懂的大神嗎?記憶體中發生了什么事情?
詳細的來,不懂的也亂答
String a = new String("A");
String a ="A";
這兩個區別,圖片中為什么答案是這樣。
不要用舊的JDK知識回答
uj5u.com熱心網友回復:
關于第一個問題:new的意思是在記憶體中新開辟一塊字串,新開辟的字串值為"A",然后把新字串的值---A,賦給a;而String a="A"意為直接給a賦值為"A";
下面的問題是這樣的:"=="比較的是儲存地址;因為a4中已經開辟了AA的記憶體,所以a8是指向它的;
你用.equals比較就是true了.
昨天新建了一個群,歡迎小白,大神,非路人,入坑討論
群號:
450339881
uj5u.com熱心網友回復:
再多寫一行測驗代碼你就懂了 String s1_1 = new String("aaaa");
s1_1.intern();
String s1_2 = "aaaa";
System.out.println(s1_1 == s1_2);
String s2_1 = new String("aa") + new String("bb");
s2_1.intern();
String s2_2 = "aabb";
System.out.println(s2_1 == s2_2);
String s3_1 = new String("aa") + new String("bb");
s3_1.intern();
String s3_2 = "aabb";
System.out.println(s3_1 == s3_2);回傳false
true
false
uj5u.com熱心網友回復:
沒有一個解釋的;// ① 堆記憶體中會 出現 變數a4_1(地址為Da41值為AA) ,a4_2 (地址為Da42值為BB), a4(地址為Da4值為 AABB)
// 常量池中出現 AA(Ca41), BB(Ca42)
String a4 = new String("AA") + new String("BB");
// intern() 會先判斷 常量池中是否已存在 AABB, 如果存在 回傳 常量池中AABB 的地址,如果不存在,將AABB(a4)寫入常量池 地址為 a4 的記憶體地址
a4.intern();
// a5 直接指向 常量池中 AABB 的地址,a5(地址a4)
String a5 = "AABB";
// 此時 a4 a5 的記憶體地址相同
System.out.println(a4 == a5); // true
// new String() 重新開辟記憶體地址 a6 (Da6)
String a6 = new String("AA");
// 先判斷 發現 AA 已經存在于常量池 (① 中 AA 已被寫入常量池)
a6.intern();
// 指向 常量池中的 AA (a41)
String a7 = "AA";
System.out.println(a6 == a7); // false
uj5u.com熱心網友回復:
new String()都是放在堆中,“ “放在常量池中,String.intern()1.7版改為了首次參考,如果該字串常量池沒有則把該字串的堆的參考地址給這個字串常量,以后直接賦予字串常量的都是直接參考了首次寫入該常量的堆的參考地址。所以”aabb“在常量池中的是a4的參考地址。 而a6在執行intern(),因為a5賦值時aa已經被寫入常量池,所以無效。
uj5u.com熱心網友回復:
能一步一步畫圖出來嗎?標明一下堆疊、堆、常量池在程序中的變化和關系
uj5u.com熱心網友回復:
String a1 = new String("AA") ;
a1.intern();
String a2 = "AA";
System.out.println(a1 == a2); //為什么會是false呢?
uj5u.com熱心網友回復:
我上面已經解釋過了,a1 是指向 堆中的記憶體地址 D-a-1
a1.intern() 時,發現 AA 在 常量池中已經存在了,不會將 AA 的地址指向 a1
String a2 = AA ; a2 的記憶體地址是 常量池中 AA 的地址 和a1 堆中的地址是不相等的
uj5u.com熱心網友回復:
可以這么理解 所有出現在 “ ”之間的 字符 ,jvm都會將其寫入 字符常量池
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91766.html
標籤:Java SE
上一篇:java初學者,問個問題
下一篇:IDEA Error creating bean with name 'cartServiceImpl': Injectiorror creating be
