Méthode clone() de Java LinkedList
clone()La méthode est dans JavaObjectune méthode de la classe, utilisée pour créer et renvoyer une copie de l'objet actuel. DansLinkedListla classe, cette méthode est redéfinie pour implémenter une copie superficielle de la liste chaînée.
Points clés:
- Elle renvoie une nouvelle
LinkedListobjet - La nouvelle liste chaînée contient les mêmes éléments que la liste chaînée d'origine
- Les éléments eux-mêmes ne sont pas copiés (copie superficielle)
Syntaxe de la méthode
Valeur de retour:
- Renvoie this
LinkedListune copie superficielle de
Exceptions:
- Ne lève aucune exception
Comment utiliser la méthode clone()
Exemple d'utilisation de base
Exemple
public class LinkedListCloneExample {
public static void main(String[] args) {
// Créer la liste chaînée d'origine
LinkedList<String> originalList = new LinkedList<>();
originalList.add("Pomme");
originalList.add("Banane");
originalList.add("Cerise");
// Cloner la liste chaînée
LinkedList<String> clonedList = (LinkedList<String>) originalList.clone();
// Afficher les deux listes chaînées
System.out.println("Liste originale : " + originalList);
System.out.println("Liste clonée : " + clonedList);
}
}
Sortie:
Original List: [Apple, Banana, Cherry] Cloned List: [Apple, Banana, Cherry]
Copie superficielle vs copie profonde
Caractéristiques de la copie superficielle
- Les références des éléments sont les mêmes: Les éléments de la liste chaînée clonée et de la liste chaînée originale sont les mêmes objets
- Modifier un élément affecte les deux: Si vous modifiez un objet dans la liste chaînée, les deux listes chaînées seront affectées
Exemple
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();
// Modifier un élément dans la liste chaînée d'origine
original.get(0).name = "Orange";
System.out.println("Original: " + original);
System.out.println("Cloned: " + cloned);
}
}
Sortie:
Original: [Orange] Cloned: [Orange]
Comment implémenter une copie profonde
Si vous avez besoin d'une copie complètement indépendante (y compris les éléments), vous devez implémenter manuellement une copie profonde :
Exemple
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());
}
// Modifier un élément dans la liste chaînée d'origine
original.get(0).name = "Orange";
System.out.println("Original: " + original);
System.out.println("Deep Cloned: " + deepCloned);
}
}
Sortie:
Original: [Orange] Deep Cloned: [Apple]
Scénarios d'application pratiques
- Protéger les données d'origine: Lorsque vous devez manipuler une liste chaînée mais que vous ne voulez pas modifier les données d'origine
- Copie rapide: Lorsque vous devez créer rapidement une liste chaînée avec le même contenu
- Environnement multithread: Lors de l'utilisation de copies indépendantes des mêmes données dans différents threads
Notes
- Conversion de type: clone() renvoie le type Object et doit être converti en LinkedList
- Immutabilité des éléments: Pour les objets immuables (tels que String), une copie superficielle suffit
- Considérations de performance: Le clonage d'une grande liste chaînée entraîne un certain surcoût de performance
- Problèmes de concurrence: Si la liste chaînée est modifiée pendant le clonage, cela peut entraîner une incohérence
Questions fréquentes
Q1 : Quelle est la différence entre la méthode clone() et l'affectation directe ?
Affectation directe(commelist2 = list1) crée simplement une nouvelle référence pointant vers le même objet, tandis queclone()crée un nouvel objet indépendant.
Q2 : Pourquoi la méthode clone() renvoie-t-elle Object au lieu de LinkedList ?
C'est, en Java,clone()la conception standard de la méthode, exigeant que les sous-classes la redéfinissent et renvoient un type plus spécifique.
Q3 : Comment cloner une LinkedList d’objets personnalisés ?
Assurez-vous que la classe personnalisée implémenteCloneablel’interface et redéfinit laclone()méthode, puis suivez l’approche de l’exemple de copie profonde.
Résumé
LinkedListdeclone()La méthode permet de créer rapidement une copie d’une liste chaînée, mais notez qu’il s’agit d’une copie superficielle. Choisissez d’utiliser une copie superficielle ou d’implémenter une copie profonde selon les besoins réels, en particulier lorsqu’on manipule des listes chaînées contenant des objets mutables.
Java LinkedList