[英]Why Linkedlist in hashmap?Why not other implementation of List?
[英]Why LinkedList clone method implementation needs to store the copyied list into virgin state?
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;
}
這是LinkedList
的源代碼。 clone
已經擁有原始列表中的元素,將其設為空並再次分配元素的目的是什么?
clone
方法的目的是返回實例對象的副本。 他們將復制的正確含義委托給實現者類,但主要要求是當object.clone() != x
時,它返回true 。
在 Java LinkedList
的情況下,它返回元素的淺表副本,而不是元素自身的副本。 在這種情況下list.clone() != list
,它仍然是true ,但是當您檢查它們的元素時將返回false (例如list.get(0) != list.clone().get(0)
)。
復制列表的目的是不鏈接到原始列表,因此您可以在不修改原始列表的情況下添加/插入/刪除元素。
示例(偽代碼):
original.add(1);
original.add(2);
original.size(); // 2
clonedList = original.clone();
clonedList.size(); // 2
clonedList.add(3);
clonedList.size(); //3
originalList.size(); //2
java.util.LinkedList
的實現方式是它使用Node<E>
對象將元素鏈接在一起。 並且LinkedList
對象具有對列表中first
和last
Node<E>
的引用。
如果你滾動一下,你會發現這個聲明:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
從視覺上看,一個有 4 個元素的LinkedList
可以這樣想:
當克隆一個鏈表時,我們期望發生的是復制整個Node
鏈。 像這樣:
但是, superClone
只是調用super.clone
,它不會復制這些Node
對象。 它只復制LinkedList
對象。 因此,僅通過調用super.clone
來實現LinkedList.clone
是不正確的,因為這樣克隆的列表將使用與原始列表相同的Node
鏈:
這意味着在鏈的中間添加一些東西會將那個東西添加到克隆列表和原始列表中!
通過將克隆列表重置為其初始狀態,然后重新添加原始列表中的所有元素,我們為克隆列表創建了一個新的Node
對象鏈。 這是因為add
創建了新的Node
對象:
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.