2013-05-11 51 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()); 
    } 
    
相关问题