[英]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.