簡體   English   中英

了解有效的Java深層復制示例

[英]Understanding Effective Java deep copy example

在有效的Java,第二版,第11項中,可以找到以下深層復制示例:

public class HashTable implements Cloneable {
    private Entry[] buckets = ...;

    private static class Entry {
        final Object key;
        Object value;
        Entry next;
        Entry(Object key, Object value, Entry next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }

        // Recursively copy the linked list headed by this Entry
        Entry deepCopy() {
            return new Entry(key, value,
                    next == null ? null : next.deepCopy());
        }
    }
    @Override public HashTable clone() {
        try {
            HashTable result = (HashTable) super.clone();
            result.buckets = new Entry[buckets.length];
            for (int i = 0; i < buckets.length; i++)
                if (buckets[i] != null)
                    result.buckets[i] = buckets[i].deepCopy();
            return result;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

我不明白這是如何進行深層復制的:鍵和值是對象,因此沒有原始類型。 因此,據我了解,

// Recursively copy the linked list headed by this Entry
Entry deepCopy() {
    return new Entry(key, value,
            next == null ? null : next.deepCopy());
}

創建一個新Entry ,並引用原始Entry的鍵和值?

深度復制不是從本質上講的意思:向下復制直到達到原始類型,然后將其復制到克隆中?

感謝您對此的任何提示!

這是一個“深層副本”,因為對原始對象鏈接列表的更改(通過next )將不會在副本中看到,反之亦然。 將其與“淺復制”進行比較,如果新對象剛剛復制了原始的next引用,則會進行“淺復制”。

不過,就鍵和值而言,它是一個淺表副本-如果它們是可變類型並且被突變,則是的,可以通過原始版本和“克隆”版本看到該突變。

因此,最終,它是比天真的“復制所有引用”方法更深的副本-但這不是完全深的副本。

創建深層副本時,在新的HashTable中僅具有“相同”條目是不夠的。 您必須為每個條目創建新實例 否則,每個表都將包含對相同條目對象的引用。 然后,當有人修改第一個表中的值時,該值也將在secon表(新副本)中被修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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