繁体   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