2011-05-21 127 views
1
private static Map<Integer, String> choices = new HashMap<Integer, String>(3); 
// choices get populated here 

將Map中的元素克隆到不同結構的最簡單方法是什麼?如何克隆地圖中的元素

+0

你想複製到的其他數據結構是什麼?另一張地圖? – 2011-05-21 02:56:05

+0

你想要做什麼?用*參考*的副本創建一個新的地圖到原始對象中?或者創建一個新的地圖,* *對象本身*的*副本。非常不同的事情。 – hvgotcodes 2011-05-21 03:00:07

+0

是複製到另一個地圖,並想克隆地圖本身的所有元素 – Jason 2011-05-21 03:09:34

回答

1

通過你使用「克隆」我假設你試圖將元素複製到另一個地圖。你可以很容易地做到這一點:

Map<...> myMap; 

Map<...> newMap = new HashMap<...>(myMap); 

//or 

Map<...> newMap; 
newMap.putAll(myMap); 
+0

我想知道是否有一個輔助函數在commons-lang庫中的某處做了類似的事情。我認爲這應該是簡單直接的,但我想這種方法很好 – Jason 2011-05-21 03:11:16

+0

它怎麼會更簡單? – MeBigFatGuy 2011-05-21 03:30:10

1

這取決於你想克隆多深。如果你的鍵和值是可序列化的,那麼你可以反序列化和序列化。否則,另一種方法是手動。

+0

在這種情況下,淺層克隆與完全深層克隆一樣好,因爲整數和字符串是不可變的。 – MeBigFatGuy 2011-05-21 03:30:43

2

對於你的情況,因爲Integers和Strings是不可變的,所以你可以做Mark說的。這是可行的,因爲一旦創建完成後就不能修改整數/字符串。

在一般情況下,如果您沒有不可變對象,您需要非常清楚地瞭解您要做什麼。有兩種可能性,每種可能都會產生截然不同的後果。

首先是您要創建一個新的Map,其中包含對第一個Map中的對象的等效引用。如果你走這條路線,兩個地圖都將包含指向相同基礎對象的引用。即如果您從Map導出對象並對其進行修改,則更改將反映在其他集合中,因爲兩個Maps都包含對相同對象的引用。如果你想走這條路,@Mark提供了一個很好的答案。

第二個是您要創建一個新的Map,其中包含對第一個Map中的對象的副本的引用。在這種情況下,您實際上需要爲第一個Map中的每個對象創建一個新對象。您可以將copy()方法添加到類定義中,也可以在該類上創建「複製構造函數」。這是一個構造函數,它接受對其類型的Object的引用並創建參數的副本。由於您正在複製對象本身,因此修改地圖中的對象不會影響其他地圖中的對象。請注意,如果您的對象反過來引用其他對象,您也需要複製這些對象。

這些選擇,因爲在Java中存在,當你做Object obj = new Object(),「OBJ」是參考到您剛纔創建的東西。如果你做Object obj2 = obj你有2個引用到相同的基礎對象。調用方法或更改任一參考的屬性都會影響同一個對象。當你使用第一種方法時,最終會在每個映射中引用不同的引用(因爲java總是按值傳遞,這意味着引用值被複制),但這些不同的引用仍然具有相同的值,所以他們指向相同的基礎對象。

+0

我猜在這種情況下,馬克的解決方案將工作,因爲整數和字符串都是不可變的,但否則個別元素必須克隆(以某種方式)並添加到新地圖。 – 2011-05-21 03:19:34

+0

@bala你是對的。讓我修改我的答案,這樣我就不必浪費所有的努力;) – hvgotcodes 2011-05-21 03:21:06