gpt4 book ai didi

java - 链表的浅拷贝不反射(reflect)添加新节点时的变化

转载 作者:搜寻专家 更新时间:2023-10-31 20:31:35 24 4
gpt4 key购买 nike

diagram我读了很多书,但似乎不问这里就无法消除我的困惑。根据图表,当我使用 clone() 创建链表的浅拷贝时。创建一个新的链表,并将原始链表中的 head 变量的引用值复制到克隆链表中,并共享其余节点。所以如果我使用克隆添加一个新节点,这应该对原始节点可见,不是吗?但是当打印 list1 时,值 3 被忽略了。谁能告诉我为什么?

LinkedList<Integer> list1 = new LinkedList<>();
l1.add(1);
l1.add(2);
LinkedList<Integer> list2 = (LinkedList) l1.clone();
l2.add(3);

最佳答案

clone() 创建新的 LinkedList 结构并返回对第一个节点的新引用。这两个 LinkedList 之间的关系是它们共享相同的节点 values。当您对旧列表或新列表进行一些 add\remove 操作时,这些操作不会更改其他列表。这就是我们执行 copy 的原因 - 我们不想在更改副本时更改原始链表结构。

来自 LinkedList.clone 文档:

Returns a shallow copy of this LinkedList. (The elements themselves are not cloned.) @return a shallow copy of this LinkedList instance

考虑下面的例子:

import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;

public class LinkedListsApp {

public static void main(String[] args) throws Exception {
LinkedList<AtomicInteger> l1 = new LinkedList<>();
l1.add(new AtomicInteger(100));
l1.add(new AtomicInteger(200));

LinkedList<AtomicInteger> l2 = (LinkedList) l1.clone();
l2.add(new AtomicInteger(300));

System.out.println(l1);
System.out.println(l2);

// change element on first list
l1.get(0).incrementAndGet();

System.out.println();
System.out.println("After change internal state of first element");
System.out.println(l1);
System.out.println(l2);
}
}

以上代码打印:

[100, 200]
[100, 200, 300]

After change internal state of first element
[101, 200]
[101, 200, 300]

正如我们所见,当我们改变第一个列表中第一个元素的内部状态时,它对第二个列表也是可见的。因此,没有每个元素值的深拷贝,而是结构的拷贝——节点和顺序的拷贝。

为了清楚起见,让我们看一下 Java 8 中的实现:

public Object clone() {
LinkedList<E> clone = superClone();

// Put clone into "virgin" state
clone.first = clone.last = null;
clone.size = 0;
clone.modCount = 0;

// Initialize clone with our elements
for (Node<E> x = first; x != null; x = x.next)
clone.add(x.item);

return clone;
}

看看 for-each 循环。它遍历原始列表并将值添加到 clone 列表。方法 add 创建新的 Node 对象,它存储与原始列表相同的值:x.item

关于java - 链表的浅拷贝不反射(reflect)添加新节点时的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55080507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com