-1

假设我在 this -> Iterable allNodes 中有一个名为“Node”的对象列表。

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

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

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

4

1 回答 1

3

它将成为一个参考。当你执行:

copyAllNodes.add(node)

您将node作为对象插入到copyAllNodes.

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

copyAllNodes.add(node.clone)

这将是一个您可以修改的副本,而不会对复制的对象产生任何影响。最好记住默认的克隆方法只是对象的浅拷贝

文档

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

于 2012-07-02T21:02:32.187 回答