2013-05-11 17 views
0

我在Java中引用對象時遇到問題。這是情況。如何將HashMap複製到具有不同引用的ArrayList

比方說,我有一個名爲MyObject的對象類。

class MyObject { 
     Long id; 
     String item; 
     Integer number; 
     BigDecimal bigNumber; 
     //and Some getter and setter methods 
} 

讓我們也說我有HashMap的:

HashMap<Long, MyObject> myHash = new HashMap<Long, MyObject>(); 

和我填此HashMap與MyObject來的一些對象。

然後,當我嘗試將此散列表的所有元素複製到arrayList(使用addAll方法)時,散列表中包含的所有對象都被複制到具有相同引用的數組列表中。出於這個原因,當我嘗試在散列表中更改MyObject對象時,它也在arrayList中更改。我不想那樣。我如何防止這種情況發生?

我希望我明確地告訴問題。

在此先感謝。

+0

你必須複製'MyObject',通常與拷貝構造函數。 – 2013-05-11 17:40:15

回答

1

當前您只是複製參考。這是因爲複製對象非常昂貴。

在你的情況下,你想複製對象,所以你需要複製每一個,因爲你將它們添加到列表中。類似於

for(MyObject mo: myHash.values()) 
    list.add(mo.copy()); 

您可以通過多種方式實現複製,包括使用clone();

0

您應該創建數據的副本,然後用列表使用副本:

class MyObject { 
    .. 

    public MyObject dupe() { 
    return new MyObject(id, item, number, bigNumber, ..); 
    } 
} 

void createList() { 
    ArrayList<MyObject> list = new ArrayList<MyObject>(); 
    for (Map.Entry<Long, MyObject> e : map.entries()) 
    list.add(e.getValue().dupe()); 
} 
0

你需要克隆/複製的MyObject你將它們添加到ArrayList中之前。當您使用addAll時,只有對象引用從源集合複製到目標集合,而對象本身則不是。

ArrayList copyTo = new ArrayList() 
for(MyObject current : myHash.values()) 
{ 
    copyTo.add(copy(current)); 
} 


MyObject copy(MyObject o) 
{ 
    MyObject copyObj = new MyObject(); 
    // set attributes here from 'o' to 'copyObj' 
    return copyObj; 
} 
1

我會使類MyObject通過實現Cloneable接口可複製的,看到Cloneable Javadoc

Java複製引用而不是對象。學習和理解這一點很重要。在你的情況下,你想複製對象,所以你必須實現一個方法,通過地圖,複製你的對象,並將這些副本的引用放入數組中。

如果您需要一些關於Java中的克隆的更多信息,this Wikipedia page是一個很好的來源。

的解決方案可能是這樣的:

  • 製作類MyObject可複製的,通過實現Cloneable接口。 Object具有方法clone()的默認實現,其複製所有字段。在你的情況下,你有LongString,IntegerBigDecimal字段。所有這些都是不可變的,所以他們不需要自己克隆,這就是爲什麼你不需要在你的課程的clone()方法中做任何事情。您仍需要覆蓋Object.clone()才能公開。如果其中一個字段引用另一個需要克隆的對象,則需要將代碼添加到clone()

    class MyObject implements Cloneable { 
        Long id; 
        String item; 
        Integer number; 
        BigDecimal bigNumber; 
        //and Some getter and setter methods 
    
        @Override 
        public MyObject clone() throws CloneNotSupportedException { 
         return (MyObject)super.clone(); 
        } 
    } 
    
  • 寫方法從​​地圖複製對象到一個數組:

    public ArrayList<MyObject> getArray() { 
        ArrayList<MyObject> list = new ArrayList<MyObject>(myHash.size()); 
    
        for(MyObject object : myHash) 
         list.add(object.clone()); 
    } 
    
相關問題