加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:42:02 所属栏目:Java 来源:网络整理
导读:朋友们, 我正面临一个问题,我有phoneContacts列表,其中包含姓名和电话号码. 我想将它复制到两个不同的静态列表中,以便我可以将它用于其他活动.我正在使用以下代码,但它在检索数据时显示我最后的列表引用 任何人都指导我如何单独复制这两个对象? MyContacts.
朋友们,

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

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"

任何帮助,将不胜感激.

解决方法

在这种情况下,您需要制作列表的深层副本,即不复制引用的副本,但实际上复制引用所指向的对象.

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

您可以通过实现Cloneable(和使用.clone())或创建自定义“复制构造函数”来解决此问题,该复制构造函数将要复制的对象作为参数,并基于该参数的数据创建新对象.无论选择哪个选项,都必须遍历列表并对每个对象执行复制.

这是一个使用copy-constructor方法的示例:

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

相关问题:

> What is the difference between a deep copy and a shallow copy?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读