Java中有关列表的引用和副本

时间:2012-07-02 21:00:14

标签: java list reference copy

假设我有一个名为“Node”的对象列表 - >可重复的allNodes。

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

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

副本是否成为引用,还是不影响原始列表的副本?

1 个答案:

答案 0 :(得分:3)

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

copyAllNodes.add(node)

您是node的对象copyAllNodes

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

copyAllNodes.add(node.clone)

这将是一个副本,您可以修改而不会对复制的对象进行任何反射。 最好记住,默认克隆方法只是对象的浅层副本

来自documentation

  

Object类的方法clone执行特定的克隆   操作。首先,如果此对象的类没有实现   接口Cloneable,然后抛出CloneNotSupportedException。注意   所有数组都被认为是实现了Cloneable接口。   否则,此方法将创建此类的新实例   对象并初始化其所有字段的确切内容   该对象的相应字段,好像通过赋值;内容   这些田地本身没有克隆。因此,该方法执行a   这个对象的“浅拷贝”,而不是“深拷贝”操作。