【问题标题】:References and Copies inside of Java regarding to listsJava 中关于列表的引用和副本
【发布时间】:2012-07-02 21:00:13
【问题描述】:

假设我在其中有一个名为“Node”的对象列表 -> 可迭代的 allNodes。

假设我遍历了 allNodes 中的所有节点并将它们添加到自己的列表中,如下所示:

Iterable<Node> allNodes = dataManager.getAllNodes();
List<Node> copyOfAllNodes;
for(Node node : allNodes) {
    copyOfAllNodes.add(node);
}

副本成为参考还是不影响原始列表的副本?

【问题讨论】:

  • 假设你不知道(你应该知道!),测试有那么难吗?
  • 碰一下先生,你说得对,我绝对应该自己测试一下,看看是不是。

标签: java list reference copy


【解决方案1】:

它将成为一个参考。当你表演时:

copyAllNodes.add(node)

您将 node 插入到 copyAllNodes 中,这是一个对象。

如果您想要对象的副本,您还有其他方法。其中一种方法可能是close,即基本上实现Cloneable 接口并公开clone 方法以复制对象,因此您可以执行以下操作:

copyAllNodes.add(node.clone)

这将是一个您可以修改的副本,而无需对复制的对象进行任何反射。 请记住,默认的 clone 方法只是对象的浅拷贝

来自documentation

类 Object 的方法 clone 执行特定的克隆 手术。首先,如果这个对象的类没有实现 接口 Cloneable,然后抛出 CloneNotSupportedException。笔记 所有数组都被认为实现了接口 Cloneable。 否则,此方法会创建 this 类的新实例 对象并完全使用对象的内容初始化其所有字段 这个对象的对应字段,就像通过赋值一样;内容 的字段本身没有被克隆。因此,该方法执行 此对象的“浅拷贝”,而不是“深拷贝”操作。

【讨论】:

  • 谢谢你说清楚,我通常用 C++ 编码,所以我对发生的事情有点困惑。
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2016-08-01
  • 1970-01-01
  • 2020-08-12
  • 2021-11-27
  • 2019-11-16
相关资源
最近更新 更多