Méthode clone() de Java LinkedList

Java LinkedList 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 nouvelleLinkedListobjet
  • 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

public Object clone()

Valeur de retour:

  • Renvoie thisLinkedListune copie superficielle de

Exceptions:

  • Ne lève aucune exception

Comment utiliser la méthode clone()

Exemple d'utilisation de base

Exemple

import java.util.LinkedList;

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

  1. 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
  2. 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

import java.util.LinkedList;

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

import java.util.LinkedList;

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

  1. 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
  2. Copie rapide: Lorsque vous devez créer rapidement une liste chaînée avec le même contenu
  3. Environnement multithread: Lors de l'utilisation de copies indépendantes des mêmes données dans différents threads

Notes

  1. Conversion de type: clone() renvoie le type Object et doit être converti en LinkedList
  2. Immutabilité des éléments: Pour les objets immuables (tels que String), une copie superficielle suffit
  3. Considérations de performance: Le clonage d'une grande liste chaînée entraîne un certain surcoût de performance
  4. 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 Java LinkedList

Autres extensions