如何用不同的引用创建相同对象的副本?

时间:2011-06-01 08:34:09

标签: java android

朋友,

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

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"

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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.

相关问题:

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

传递您想要复制的对象并获取您想要的对象



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

	}




将你的objDest投射到Desiered对象