String e=new String("a");
String f="a";
System.out.println(e==f);
結果為何回傳false
如果new的物件放在堆疊中,應該放在常量池中,應該是true。
如果放到堆中,可是基本型別不都是放在堆疊上嗎?
uj5u.com熱心網友回復:
String在Java中不是基本型別……uj5u.com熱心網友回復:
String是物件,==相當于比較兩個物件的地址,堆疊中保存的是參考變數,常量池不在堆疊中是獨立的一個記憶體空間uj5u.com熱心網友回復:
使用String a="xx";是字串常量,存在堆疊的常量池中,但是使用String b = new String("xx");就是重新new一個物件,這個是存放在堆中的。如上比較,肯定回傳false;
uj5u.com熱心網友回復:
new的物件肯定放在堆里啊uj5u.com熱心網友回復:
系統記憶體一般情況來說分為四個heap 堆 放 物件 也就是new 出來的東西
stack 堆疊 放區域變數
static segment 靜態區 用來放 靜態變數 和字串常量
data segement 代碼區 用來放代碼的
String e=new String("a"); //e是存放在堆記憶體里,堆疊記憶體里存放e對應的參考地址
String f="a"; //f存放在堆疊記憶體的常量池中,
String不是基本型別,直接定義的String f="a";存放在常量池,new出來的就是放在堆記憶體
uj5u.com熱心網友回復:
new 出來的物件,指向的是記憶體地址值;“” 字串是從常量池里面拿的;
結果肯定是false啊;
例如:String a = “A”;String b = “A”; 這兩個都是從常量池拿的, a== b 為true
String a = new String(“A”);String b = new String(“A”);這兩個完全是兩個不同的記憶體地址值,a == b 為false
uj5u.com熱心網友回復:
== 同時還比較地址的值,如果不是同一個物件,肯定不相等。又因為new出來的物件是新分配的一個記憶體地址空間,所以不會相等uj5u.com熱心網友回復:
String e=new String("a");//創建了兩個物件:一個將“a”存放在常量池(字串池)中,一個new的在堆疊中存放參考。String f="a";//沒有創建物件:先找常量池中有沒有“a”,發現有,因此直接從池中取出而不創建新物件。
System.out.println(e==f);
//雙等對于基本型別資料比較的是值,而這里對于物件來說是比較的參考:
//如果輸出System.identityHashCode(e),回傳的應該是e在堆疊中的“地址”。
//所以e==f應該是比較的e在堆疊中的“地址”和f在常量池中的“地址”(e跟f共用常量池中的一塊“地址”)
uj5u.com熱心網友回復:
假設在類A的main方法里 new類B 的實體, 那個這個B的實體 是放在堆疊中 還是 堆中? 放在堆中的話 ,理論上來說它其實是類A的區域變數。還是說只要NEW出來的物件實體,都是放在堆中? 不管它是在方法體的外,還是內 。 只要是NEW出來的 ,就放到堆里,
那方法體之外不是 NEW出來的變數呢? 比如int A .(它 是類A的全域變數,它應該在堆疊里還是堆里)。
我現在有點糊涂的是, 存在堆里還是堆疊里 是依據資料型別來的嗎? 只要是基本資料型別 比如 int char double 這些都放到堆疊里,
只要是參考資料型別都放到堆里? 比如string 比如 自定義的類的實體。
和全域 ,區域沒有關系?
uj5u.com熱心網友回復:
比如class 1 {
int a
main()
{
int b}
}
資料a b是不是都存在堆疊中?
uj5u.com熱心網友回復:
比如class 1 {
A = new class2()
main()
{
B = new class3() }
}
類的實體A B是不是都存在堆記憶體中?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247463.html
標籤:Java相關
上一篇:JSONObject如何將this轉換為json字串
下一篇:請問knife4j2.0.8,swagger2如果展示介面引數中含有JsonFormat.Shape.OBJECT的列舉欄位?
