Java LinkedList clone()-Methode
clone()Die Methode ist in JavaObjecteine Methode der Klasse, die verwendet wird, um eine Kopie des aktuellen Objekts zu erstellen und zurückzugeben. InLinkedListIn der Klasse wird diese Methode überschrieben, um eine flache Kopie der verknüpften Liste zu implementieren.
Kernpunkte:
- Es wird eine neue zurückgegeben
LinkedListObjekt - Die neue verknüpfte Liste enthält dieselben Elemente wie die ursprüngliche verknüpfte Liste
- Die Elemente selbst werden nicht kopiert (flache Kopie)
Methodensyntax
Rückgabewert:
- Gibt this zurück
LinkedListeine flache Kopie von
Ausnahmen:
- Löst keine Ausnahme aus
Wie man die clone()-Methode verwendet
Grundlegendes Anwendungsbeispiel
Beispiel
public class LinkedListCloneExample {
public static void main(String[] args) {
// Die ursprüngliche verknüpfte Liste erstellen
LinkedList<String> originalList = new LinkedList<>();
originalList.add("Apple");
originalList.add("Banana");
originalList.add("Cherry");
// Die verknüpfte Liste klonen
LinkedList<String> clonedList = (LinkedList<String>) originalList.clone();
// Beide verknüpften Listen ausgeben
System.out.println("Ursprüngliche Liste: " + originalList);
System.out.println("Geklonte Liste: " + clonedList);
}
}
Ausgabe:
Original List: [Apple, Banana, Cherry] Cloned List: [Apple, Banana, Cherry]
Flache Kopie vs tiefe Kopie
Eigenschaften der flachen Kopie
- Elementreferenzen sind dieselben: Die Elemente in der geklonten verknüpften Liste und der ursprünglichen verknüpften Liste sind dieselben Objekte
- Das Ändern eines Elements betrifft beide: Wenn Sie ein Objekt in der verknüpften Liste ändern, sind beide verknüpften Listen betroffen
Beispiel
class Fruit {
String name;
Fruit(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public class ShallowCopyExample {
public static void main(String[] args) {
LinkedList<Fruit> original = new LinkedList<>();
original.add(new Fruit("Apple"));
LinkedList<Fruit> cloned = (LinkedList<Fruit>) original.clone();
// Ein Element in der ursprünglichen verketteten Liste ändern
original.get(0).name = "Orange";
System.out.println("Original: " + original);
System.out.println("Cloned: " + cloned);
}
}
Ausgabe:
Original: [Orange] Cloned: [Orange]
Wie man Deep Copy implementiert
Wenn Sie eine vollständig unabhängige Kopie (einschließlich der Elemente) benötigen, müssen Sie eine tiefe Kopie manuell implementieren:
Beispiel
class Fruit implements Cloneable {
String name;
Fruit(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return name;
}
}
public class DeepCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
LinkedList<Fruit> original = new LinkedList<>();
original.add(new Fruit("Apple"));
LinkedList<Fruit> deepCloned = new LinkedList<>();
for (Fruit fruit : original) {
deepCloned.add((Fruit) fruit.clone());
}
// Ein Element in der ursprünglichen verketteten Liste ändern
original.get(0).name = "Orange";
System.out.println("Original: " + original);
System.out.println("Deep Cloned: " + deepCloned);
}
}
Ausgabe:
Original: [Orange] Deep Cloned: [Apple]
Praktische Anwendungsszenarien
- Originaldaten schützen: Wenn Sie mit einer verketteten Liste arbeiten müssen, aber die Originaldaten nicht ändern möchten
- Schnelle Kopie: Wenn Sie schnell eine verkettete Liste mit demselben Inhalt erstellen müssen
- Multithread-Umgebung: Wenn unabhängige Kopien derselben Daten in verschiedenen Threads verwendet werden
Hinweise
- Typumwandlung: clone() gibt den Typ Object zurück und muss in LinkedList umgewandelt werden
- Unveränderlichkeit von Elementen: Für unveränderliche Objekte (wie String) ist eine flache Kopie ausreichend
- Leistungsüberlegungen: Das Klonen einer großen verketteten Liste verursacht einen gewissen Leistungsmehraufwand
- Nebenläufigkeitsprobleme: Wenn die verkettete Liste während des Klonens geändert wird, kann dies zu Inkonsistenz führen
Häufig gestellte Fragen
F1: Was ist der Unterschied zwischen der clone()-Methode und direkter Zuweisung?
Direkte Zuweisung(wie z. B.list2 = list1) erzeugt lediglich eine neue Referenz, die auf dasselbe Objekt verweist, währendclone()erzeugt ein neues unabhängiges Objekt.
F2: Warum gibt die clone()-Methode Object statt LinkedList zurück?
Dies ist in Javaclone()das Standarddesign der Methode, das verlangt, dass Unterklassen sie überschreiben und einen spezifischeren Typ zurückgeben.
Q3: Wie klont man eine LinkedList mit benutzerdefinierten Objekten?
Stellen Sie sicher, dass die benutzerdefinierte Klasse implementiertCloneabledas Interface und überschreibt dieclone()Methode, und folgen Sie dann dem Ansatz im Beispiel für die tiefe Kopie.
Zusammenfassung
LinkedListvonclone()Die Methode bietet eine Möglichkeit, schnell eine Kopie einer verketteten Liste zu erstellen, aber beachten Sie, dass es sich um eine flache Kopie handelt. Wählen Sie je nach tatsächlichem Bedarf, ob Sie eine flache Kopie verwenden oder eine tiefe Kopie implementieren, insbesondere bei verketteten Listen, die veränderliche Objekte enthalten.
Java LinkedList