2011-06-28 57 views
2

我想存儲項目的ID及其相應的座標。爲此,我使用了一個TreeMap,其中Coordinates是一個包含int x和int y的類。現在,將數據插入到地圖可我寫的:將整數插入到TreeMap中

treeMapObject.put(5,new BasicRow(30,90)); 

還是我必須寫:

treeMapObject.put(new Integer(5),new BasicRow(30,90)); 

我想只有第二個是正確的,因爲地圖處理的對象。但現在的問題是,說我有以下一段代碼:

treeMapObject.put(new Integer(5),new BasicRow(30,90)); 
treeMapObject.put(new Integer(5),new BasicRow(45,85)); 

在這種情況下會發生什麼?

+0

在我上面的代碼片段中,BasicRow可以是一個內部類嗎? – aps

回答

7

實際上這兩個版本都是正確的,因爲你的Java編譯器會爲你執行所謂的「自動裝箱」:如果你提供一個int,需要一個Integer,java會自動將Integer包裝在Integer對象中。反之亦然(已經在Java 5中引入了)。如果您使用的是較舊的Java版本,甚至不應編譯。)。

對於第二個問題:您首先添加的條目將被覆蓋。

+0

*正確* - 是,*相同* - 否。 –

+0

@Andreas:好的,剝離完全相同;-) – yankee

1

yankee是對的,兩者都會工作,因爲Java會將autobox的整數值轉換爲Integer對象。

請注意,如果你想明確地做到這一點,最好是寫:的

Integer a = Integer.valueOf(5); 

代替:

Integer a = new Integer(5); 

如果使用valueOf,那麼類Integer可避免建立新的Integer對象,它會從其內部緩存中返回預先存在的Integer對象,這比創建新對象更有效。

+0

在我上面的代碼片斷中,BasicRow可以是內部類嗎? – aps

+0

@aps是的,沒有什麼特別的內部類會阻止你在地圖中使用它們作爲值。 – Jesper

0

有一個細微的差異,這不會影響地圖的行爲。在這兩種情況下,如果您嘗試得到整數5的值,則該映射將返回該基本行。

區別:第二行將始終創建一個新實例Integer,而第一個實例可能會插入現有實例。不過地圖相差等於,而不是身份,所以它實際上並不重要。只是第一行對內存消耗有非常小的正面影響。