簡體   English   中英

為什么 LinkedList 克隆方法實現需要將復制的列表存儲為原始狀態?

[英]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對象具有對列表中firstlast 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM