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