2012-01-06 18 views

回答

2

第二個問題的答案是肯定的,你在Eclipse的調試器中看到的「id」唯一標識一個對象,所以其中的變化意味着創建了一個新對象。因此,例如:

Integer i = 55; 
Integer j = new Integer(55); 
Integer k = Integer.valueOf(55); 

這裏我和k會有相同的id,因爲它們指的是同一個對象; j會有所不同。

由於對象在內存中移動,這些對象之一的內存地址並不是真正有用的信息。所有你能知道的是,如果我== K,他們是同一個對象。 (所以在這裏,我== K,但我!= J)。

6

爲什麼你需要在Java中的任何對象的內存地址?你只能說Integer實例在堆中。你找不到確切的地址。

第二個問題:是的,Integer對象是不可變的,所以當Integer類型的變量的值發生改變時,它意味着它指向Integer的不同實例。然而,這並不一定意味着新實例是創建的new Integer(42)總是會創建一個新實例,而Integer.valueOf(42)將在每次調用時創建相同的實例。

+2

除此之外,由於垃圾收集會移動物體以合併空閒空間,因此地址可能會隨時間而變化。 – 9000 2012-01-06 21:31:02

+0

我有一個問題,它如何指向不帶'Integer'的第一個被創建的'Integer'的不同實例? – JAM 2012-01-06 21:35:44

+0

'Integer x = 42'實際上被轉換爲'Integer x = Integer.valueOf(42)' - 它可以*創建一個新的實例或使用緩存的實例。 – 2012-01-06 21:38:06

0

除非你有一個離JVM開發團隊非常近的人,否則你不能找出引用變量中存儲了什麼類型的數據/地址。我們需要的只是訪問駐留在該引用中的對象並對其進行操作/執行。

我不確定你的問題的第二部分。另外,我無法確認ID(在調試器中)是否指Java堆內存位置。

相關問題