Technologieaustausch

Bitte erläutern Sie den Unterschied zwischen Deep Copy und Shallow Copy in Java. Was sind anonyme innere Klassen in Java? Welche Anwendungsszenarien gibt es?

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.

Flache Kopie

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 durchCloneableSchnittstelle und Umschreibungclone()Methode zur Implementierung einer flachen Kopie.Objectim 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.WennOriginalDas Objekt wird flach kopiert, dann dasnumsund im Originalobjektnumszeigt auf dasselbe Array-Objekt.

Tiefe Kopie

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,numsDas Array wird ebenfalls kopiert, sodass das Originalobjekt und die Kopie nicht gemeinsam genutzt werdennumsArray.

Zusammenfassen

  • Flache KopieDas Objekt selbst und seine nicht statischen Felder werden kopiert, die referenzierten Objekte jedoch nicht.
  • tiefe KopieEs werden nicht nur das Objekt selbst und seine nicht statischen Felder kopiert, sondern auch alle Mitgliedsvariablen von Referenztypen werden rekursiv kopiert.

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?