2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Bitte erläutern Sie den Unterschied zwischen Deep Copy und Shallow Copy in Java.
In Java sind Deep Copy und Shallow Copy zwei Möglichkeiten, Objekte zu kopieren. Ihr Verhalten beim Kopieren von Objekten unterscheidet sich grundlegend.
Unter flachem Kopieren versteht man das Erstellen eines neuen Objekts und das anschließende Kopieren der nicht statischen Felder des aktuellen Objekts in das neue Objekt. Wenn das Feld ein Werttyp ist, wird das Feld Stück für Stück kopiert. Die Referenz wird kopiert, aber nicht. Das referenzierte Objekt wird nicht kopiert. Daher verweisen das Originalobjekt und seine Kopie auf dasselbe Objekt.
In Java kann dies erreicht werden durchCloneable
Schnittstelle und Umschreibungclone()
Methode zur Implementierung einer flachen Kopie.Object
im Unterrichtclone()
Mit dieser Methode kann eine flache Kopie erreicht werden.
class Original implements Cloneable { | |
private int[] nums; | |
public Original() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
public Object clone() throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
} |
In diesem Beispiel,nums
Ist ein Referenztyp.WennOriginal
Das Objekt wird flach kopiert, dann dasnums
und im Originalobjektnums
zeigt auf dasselbe Array-Objekt.
Eine tiefe Kopie kopiert nicht nur das Objekt selbst, sondern kopiert auch alle im Objekt enthaltenen Referenztyp-Mitgliedsvariablen rekursiv, was bedeutet, dass die Kopie und das Originalobjekt keine Referenztyp-Mitgliedsvariablen gemeinsam nutzen. Das Ändern von Mitgliedsvariablen eines Objekts hat keine Auswirkungen auf ein anderes Objekt.
In Java erfordert die Implementierung tiefer Kopien häufig das manuelle Schreiben von Code, um sicherzustellen, dass alle Mitgliedsvariablen von Referenztypen ordnungsgemäß kopiert werden.
class DeepCopied implements Cloneable { | |
private int[] nums; | |
public DeepCopied() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
@Override | |
public Object clone() throws CloneNotSupportedException { | |
DeepCopied copied = (DeepCopied) super.clone(); | |
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝 | |
return copied; | |
} | |
} |
In diesem Beispiel,nums
Das Array wird ebenfalls kopiert, sodass das Originalobjekt und die Kopie nicht gemeinsam genutzt werdennums
Array.
Die Entscheidung für Deep Copy oder Shallow Copy hängt von den spezifischen Anwendungsszenarien und Anforderungen ab.
Was sind anonyme innere Klassen in Java? Welche Anwendungsszenarien gibt es?