¿Cómo clonar una lista en Java?

Dada una lista en Java , la tarea es clonar esta lista.

Ejemplo:

Entrada: list = [“Geeks”, “for”, “Geeks”]
Salida: clonedList = [“Geeks”, “for”, “Geeks”]

Entrada: list = [“GeeksForGeeks”, “A Computer Science”, “Portal”]
Salida: clonedList = [“GeeksForGeeks”, “A Computer Science”, “Portal”]

En Java, existen varios métodos para clonar una lista. Este artículo explicará algunos de los principales métodos utilizados para lograr lo mismo.

  • Uso de un constructor de copia: al usar el constructor ArrayList en Java, se puede inicializar una nueva lista con los elementos de otra colección.
    Sintaxis:
    ArrayList cloned = new ArrayList(collection c);
    
    where c is the collection containing 
    elements to be added to this list.
    

    Acercarse:

    1. Cree una lista para ser clonada.
    2. Clone la lista pasando la lista original como parámetro del constructor de copia de ArrayList.

    El siguiente código ilustra este ejemplo.

    // Program to clone a List in Java
      
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
      
    class Example {
        public static void main(String[] args)
        {
            // Create a list
            List<String> original
                = Arrays.asList(
                    "GeeksForGeeks",
                    "A Computer Science",
                    "Portal");
      
            // Clone the list
            List<String> cloned_list
                = new ArrayList<String>(original);
      
            System.out.println(cloned_list);
        }
    }
    Producción:

    [GeeksForGeeks, A Computer Science, Portal]
    
  • Usando el método addAll(): La clase List tiene un método llamado addAll(), que agrega todos los elementos de una colección a la lista.

    Sintaxis:

    boolean addAll(Collection c);
    
    where c is the collection containing
    elements to be added to this list.
    

    Acercarse:

    1. Cree una lista para ser clonada.
    2. Cree una lista vacía usando el constructor ArrayList.
    3. Agregue la lista original a la lista vacía usando el método addAll().

    El siguiente ejemplo ilustrará este método.

    // Program to clone a List in Java
      
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
      
    class Example {
        public static void main(String[] args)
        {
            // Create a list
            List<String> original
                = Arrays.asList(
                    "GeeksForGeeks",
                    "A Computer Science",
                    "Portal");
      
            List<String> cloned_list
                = new ArrayList<String>();
      
            // Cloning a list
            cloned_list.addAll(original);
      
            System.out.println(cloned_list);
        }
    }
    Producción:

    [GeeksForGeeks, A Computer Science, Portal]
    
  • Usando flujos en Java 8 Usando la API de flujos introducida en JAVA 8 , es posible clonar una lista. El método collect() (junto con el método toList() ) se usa para clonar una lista.

    Acercarse:

    1. Crear una clase
    2. Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
    3. Convierte una lista de objetos en un flujo de objetos usando el método stream().
    4. Utilice los métodos de recopilación (Collectors.toList()) para recopilar todas las instancias de la lista de elementos de transmisión y devolverlas a la lista clonada.

    El siguiente programa ilustra este concepto.

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
      
    // Program to clone a List in Java
    class Example {
        public static void main(String[] args)
        {
            // Create a list
            List<String> original
                = Arrays.asList(
                    "GeeksForGeeks",
                    "A Computer Science",
                    "Portal");
      
            // Clone a list
            List<String> cloned_list
                = original.stream()
                      .collect(Collectors.toList());
      
            System.out.println(cloned_list);
        }
    }
    Producción:

    [GeeksForGeeks, A Computer Science, Portal]
    
  • Usando el método clone(): El método Clone() de una clase en Java se usa para crear una nueva instancia de una clase del objeto actual e inicializa todos sus campos con el contenido del objeto especificado. Para clonar una lista, uno puede iterar a través de la lista original y usar el método de clonación para copiar todos los elementos de la lista y usar el método de agregar para agregarlos a la lista.

    Sintaxis:

    protected Object clone()
    throws CloneNotSupportedException
    

    Acercarse:

    1. Cree una clase clonable, que tenga anulado el método de clonación.
    2. Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
    3. Crea una lista vacía.
    4. Recorra cada elemento de la lista original e invoque el método clone() del objeto de la clase (que devuelve la instancia de la clase) y use el método add() para agregarlo a la nueva lista.

    El siguiente ejemplo ilustra este concepto.

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
      
    // Class needs to be cloneable
    class GfG implements Cloneable {
      
        String username;
        String msg;
      
        // Constructor
        GfG(String username, String msg)
        {
            this.username = username;
            this.msg = msg;
        }
      
        // To print the objects in the desired format
        @Override
        public String toString()
        {
            return "\nHello " + username + " !\n" + msg + "\n";
        }
      
        // Overriding the inbuilt clone class
        @Override
        protected GfG clone()
        {
            return new GfG(username, msg);
        }
    }
      
    // Program to clone a List in Java
    class Example {
        public static void main(String[] args)
        {
            // Creating a list
            List<GfG> original
                = Arrays.asList(
                    new GfG("Geeks",
                            "GeeksForGeeks"),
                    new GfG("GFG",
                            "A computer science portal for geeks"));
      
            // Creating an empty list
            List<GfG> cloned_list
                = new ArrayList<GfG>();
      
            // Looping through the list
            // and cloning each element
            for (GfG temp : original)
                cloned_list.add(temp.clone());
            System.out.println(cloned_list);
        }
    }
    Producción:

    [
    Hello Geeks !
    GeeksForGeeks, 
    Hello GFG !
    A computer science portal for geeks
    ]
    
  • Uso de Apache Commons Lang : También se puede lograr lo mismo utilizando el método de clonación proporcionado por bibliotecas de terceros, como Apache Commons Lang.
    Sintaxis:
    public static  T clone(T object)
    
    where T is the type of the object
    and object is the Serializable object
    to be cloned
    

    Acercarse:

    1. Cree una clase Serializable.
    2. Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
    3. Crea una lista vacía.
    4. Recorra cada elemento de la lista original e invoque el método SerializationUtils.clone() de los objetos serializables (que devuelve la instancia de clase) y use el método add() para agregarlo a la nueva lista.

    El siguiente programa ilustra este caso.

    import org.apache.commons.lang3.SerializationUtils;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
      
    // Class should be Serializable
    class GfG implements Serializable {
        String username;
        String msg;
      
        // Constructor
        GfG(String username, String msg)
        {
            this.username = username;
            this.msg = msg;
        }
      
        // Overriding to print the objects
        // in the desired manner
        @Override
        public String toString()
        {
            return "\nHello " + username
                + " !\n" + msg + "\n";
        }
    }
      
    // Program to clone a List in Java
    class Example {
        public static void main(String[] args)
        {
            // Creating the list
            List<GfG> original
                = Arrays.asList(
                    new GfG("Mukkesh",
                            "Hey there fellows!"),
                    new GfG("McKenzie",
                            "Welcome to my page!"));
      
            // Creating an empty list
            List<GfG> cloned_list = new ArrayList<GfG>();
      
            // Looping through the list
            // and cloning each element
            // using SerializationUtils.clone
            for (GfG temp : original)
                cloned_list.add(
                    SerializationUtils.clone(temp));
            System.out.println(cloned_list);
        }
    }

    Producción:

    [
    Hello Mukkesh !
    Hey there fellows!, 
    Hello McKenzie !
    Welcome to my page!
    ]
    
  • Usando la biblioteca Gson para convertir la lista a JSON : usando la biblioteca Gson de Google, una lista se puede convertir a JSON. Esta string JSON se puede convertir en un objeto de tipo Lista y se puede usar para inicializar la nueva Lista.

    Sintaxis:

    String gson.toJson(List a);
    Returns a JSON string of the List object a.
    
    List gson.fromJson(String b, Class T)
    Returns a list of type Class T, from the JSON string b.
    

    Acercarse:

    1. Crear una clase
    2. Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
    3. Utilice la función toJson() para crear una string JSON de la lista original, pasando la misma como parámetro a esta función.
    4. Almacene la string JSON devuelta
    5. Cree una lista vacía e inicialícela directamente con el valor de la lista original utilizando la función fromJson() y pasando la string JSON almacenada como parámetro.

    El siguiente programa ilustra esto.

    import com.google.gson.Gson;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
      
    // Class should be Serializable
    class GfG implements Serializable {
        String username;
        String msg;
      
        // Constructor
        GfG(String username, String msg)
        {
            this.username = username;
            this.msg = msg;
        }
      
        // Overriding to print the object
        // in the desired format
        @Override
        public String toString()
        {
            return "\nHello " + username + " !\n" + msg + "\n";
        }
    }
      
    // Program to clone a List in Java
    class Example {
        public static void main(String[] args)
        {
            // Creating a new list
            List<GfG> original
                = Arrays.asList(new GfG("Mukkesh",
                                        "Hey there fellows!"),
                                new GfG("McKenzie",
                                        "Welcome to my page!"));
            // Creating a gson object
            Gson gson = new Gson();
      
            // Converting the list into a json string
            String jsonstring
                = gson.toJson(original);
      
            // Converting the json string
            // back into a list
            List<GfG> cloned_list
                = gson.fromJson(jsonstring, GfG);
      
            System.out.println(cloned_list);
        }
    }

    Producción:

    [
    Hello Mukkesh !
    Hey there fellows!, 
    Hello McKenzie !
    Welcome to my page!
    ]
    
  • Usando el paquete Reflection: El paquete Reflection también se puede usar para clonar una Lista.

    Acercarse:

    1. Cree una clase clonable, que tenga anulado el método de clonación.
    2. Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
    3. Crea una lista vacía.
    4. Obtenga el método de clonación de la clase utilizando el método getClass().getDeclaredMethod(“clone”) (en un elemento de la lista) y guárdelo como una instancia de método.
    5. Recorra cada elemento de la lista e invoque el método almacenado, que devolverá una instancia de clase, que se puede agregar a la nueva lista.

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
      
    // GfGclass implements Cloneable Interface
    class GfG implements Cloneable {
        String username;
        String msg;
      
        // Constructor
        GfG(String username, String msg)
        {
            this.username = username;
            this.msg = msg;
        }
      
        // Overriding to print the object
        // in the desired format
        @Override
        public String toString()
        {
            return "\nHello " + username
                + "!\n" + msg + "\n";
        }
      
        // Overriding the clone function
        @Override
        protected Object clone()
            throws CloneNotSupportedException
        {
            return new GfG(username, msg);
        }
    }
      
    class ListUtils {
        // Create a cloning function
        public static <T extends Cloneable> List<T>
        clone(List<T> original)
            throws NoSuchMethodException,
                   InvocationTargetException,
                   IllegalAccessException
        {
      
            // Boundary conditions checked
            if (original == null
                || original.size() == 0) {
                return new ArrayList<>();
            }
      
            // Get the clone method from the GfG class
            Method method
                = original.get(0)
                      .getClass()
                      .getDeclaredMethod("clone");
      
            // Create an empty list for cloning
            List<T> clone = new ArrayList<>();
      
            // Loop through the list and
            // invoke the clone method of each element
            for (T item : original) {
                clone.add((T)method.invoke(item));
            }
      
            // Return the cloned list
            return clone;
        }
      
        public static void main(String[] args)
        {
            // Creating a list
            List<GfG> original
                = Arrays.asList(
                    new GfG("Geeks",
                            "GeeksForGeeks"),
                    new GfG("GFG",
                            "A computer science portal for geeks"));
      
            // Create an empty list for cloning
            List<GfG> cloned_list = null;
      
            // Use try and catch for exception handling
            try {
                cloned_list = clone(original);
            }
            catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
            catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            catch (IllegalAccessException e) {
                e.printStackTrace();
            }
      
            // Print the cloned list
            System.out.println(cloned_list);
        }
    }
    Producción:

    [
    Hello Geeks!
    GeeksForGeeks, 
    Hello GFG!
    A computer science portal for geeks
    ]
    

Publicación traducida automáticamente

Artículo escrito por MukkeshMckenzie y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *