clone()
创造新的LinkedList
结构并返回对第一个节点的新引用。这两者之间的关系LinkedList
s 是它们共享同一个节点values
。当你做一些add
\ remove
对旧列表或新列表的操作这些操作不会更改其他列表。这就是我们这样做的原因copy
- 当我们更改副本时,我们不想更改原始链表结构。
From LinkedList.clone
文档:
返回此内容的浅拷贝LinkedList
. (The 元素本身
没有被克隆.)
@return
这个的浅拷贝LinkedList
实例
考虑下面的例子:
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
.