2011-06-01 66 views
6

朋友,如何使用不同的引用创建同一对象的副本?

我面临一个问题,我有电话联系名单中的名单和电话号码。 我想将它复制到两个不同的静态列表中,以便我可以将它用于其他活动。我正在使用下面的代码,但它显示了我在检索数据时的最后列表引用 任何人指导我如何分别获取这两个对象的副本?

MyContacts.attackContacts = new ArrayList(phoneContacts); 
Collections.copy(MyContacts.attackContacts,phoneContacts); 
MyContacts.attackContacts.get(0).setType("attack"); 

MyContacts.medicalContacts = new ArrayList(phoneContacts); 
Collections.copy(MyContacts.medicalContacts,phoneContacts); 
MyContacts.medicalContacts.get(0).setType("medical"); 

System.out.println("attack" + MyContacts.attackContacts.get(0).getType() + " medical " + MyContacts.medicalContacts.get(0).getType()); 

// result "attack medical" "medical medical" 
// it should show independent list results like "attack attack" "medical medical" 

任何帮助,将不胜感激。

回答

10

在这种情况下,您需要制作一个深度复制列表,即不复制引用但实际复制引用指向的对象的副本。

Collections.copy”将所有元素从一个列表复制到另一个列表“。与Java一样,列表的元素不是对象,而是引用。

您可以通过执行Cloneable(并使用.clone())或通过创建一个自定义的“复制构造函数”来获取该复制对象作为参数,并根据该参数的数据创建一个新对象。无论您选择哪个选项,您都必须迭代列表并在每个对象上执行复制。

下面是一个使用拷贝构造函数的方法的例子:

MyContacts.medicalContacts = new ArrayList(); 
for (Contact c: MyContacts.attackContacts) 
    medicalContacts.add(new Contact(c)); // add a copy of c. 

相关问题:

+0

感谢回复任何例如或教程?我不知道它如此使用克隆每个列表将指向另一个新的参考,我会得到结果,因为我上面提到? – UMAR 2011-06-01 08:43:34

+0

*每个列表都会指向另一个新的参考,我将得到如上所述的结果?*确切地说,你已经得到了它。增加了一个例子。 – aioobe 2011-06-01 08:44:59

+0

我得到了正确的教程感谢您指出我http://www.java2s.com/Code/Java/Language-Basics/DeepCopyTest.htm – UMAR 2011-06-01 09:53:22

1

应对列表,创建新的列表对象仍然指的是相同的元素对象。 要进行深层复制,您的元素对象必须是可克隆的,有复制构造函数或其他方式来复制它,并且您必须逐个循环地进行复制。

for (Elem x: list1) { 
    list2.add(copyOf(x)) 
} 
0

传递whcih你要复制,并得到你想要的对象的对象,

private Object copyObject(Object objSource) { 
 
\t \t try { 
 
\t \t \t ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
 
\t \t \t ObjectOutputStream oos = new ObjectOutputStream(bos); 
 
\t \t \t oos.writeObject(objSource); 
 
\t \t \t oos.flush(); 
 
\t \t \t oos.close(); 
 
\t \t \t bos.close(); 
 
\t \t \t byte[] byteData = bos.toByteArray(); 
 
\t \t \t ByteArrayInputStream bais = new ByteArrayInputStream(byteData); 
 
\t \t \t try { 
 
\t \t \t \t objDest = new ObjectInputStream(bais).readObject(); 
 
\t \t \t } catch (ClassNotFoundException e) { 
 
\t \t \t \t e.printStackTrace(); 
 
\t \t \t } 
 
\t \t } catch (IOException e) { 
 
\t \t \t e.printStackTrace(); 
 
\t \t } 
 
\t \t return objDest; 
 

 
\t }

投你objDest到Desiered对象

相关问题