Clonez la liste Java.

· ArrayList est clonable (idem pour Set et Map), mais List n'est pas clonable.

-Je veux cloner ce qui a été passé en tant que List au lieu d'un ArrayList, mais il y a des situations où je ne peux pas le faire docilement. Que devrais-je faire?

-Un exemple est présenté ci-dessous, mais il existe une méthode pour obtenir la méthode de clonage de la classe d'objets réelle et l'appeler.

・ C'est là que je me sens frustré lorsque j'utilise Java. C'est le même regret que int ⇔ Integer peut être assigné mais int [] ⇔ Integer [] ne peut pas être assigné.

-Par exemple, si vous effectuez un keySet avec HashSet, HashMap $ KeySet sera retourné, mais ce n'est pas clonable et ne peut pas être cloné par la méthode indiquée dans l'exemple. Ce genre de chose est un problème ...

・ Une autre jambe de serpent. L'exemple utilise getDeclaredMethod. -GetDeclaredMethod (getDeclaredMethods) récupère les méthodes déclarées dans la classe. -GetMethod (getMethods) inclut les méthodes déclarées dans la classe de base.

★ Ajout ★ Comme indiqué par felis ci-dessous, vous pouvez utiliser CopyOf of List à partir de Java 10. Le programme de test ci-dessous s'exécute sur JDK 1.6.

package jp.avaj.lib.algo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import jp.avaj.lib.test.ArTest;
import jp.avaj.lib.test.L;

/**
Liste des clones

ArrayList est clonable, mais List n'est pas clonable.Idem pour Set et Map.
 */
public class Tips0056 {
  public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

    List<String> list = ArList.construct("a,b,c");
    List<String> newList;

    //Ceci est une erreur de compilation
    //newList = (List<String>)list.clone();
    L.p("Tu peux le faire"); //Cependant, il est inconnu s'il s'agit d'un ArrayList lorsqu'il est passé en tant que List..
    newList = (List<String>)((ArrayList)list).clone();
    L.p(newList.toString());

    L.p("Récupérez la méthode clone de la classe réelle et appelez");
    //Obtenez la méthode de clonage dans la classe réelle.S'il y a un paramètre, spécifiez-le à la fin, mais ce n'est plus nécessaire maintenant
    Method cloneMethod = list.getClass().getDeclaredMethod("clone");
    //S'il n'y a pas de méthode, une exception se produira, donc si vous venez ici, il y a une méthode.

    //Exécutez la méthode.S'il y a un paramètre, spécifiez-le à la fin, mais ce n'est plus nécessaire maintenant.
    newList = (List<String>)cloneMethod.invoke(list);

    //Vérifiez le résultat.
    ArTest.equals("clone","expected",3,"size",newList.size());
    ArTest.equals("clone","expected","a","(0)",newList.get(0));
    ArTest.equals("clone","expected","b","(1)",newList.get(1));
    ArTest.equals("clone","expected","c","(2)",newList.get(2));
    //Vérifiez visuellement
    L.p(newList.toString());
  }
}

Le résultat est le suivant

Tu peux le faire
[a, b, c]
Récupérez la méthode clone de la classe réelle et appelez
OK clone:expected=3:size=3
OK clone:expected=a:(0)=a
OK clone:expected=b:(1)=b
OK clone:expected=c:(2)=c
[a, b, c]

Recommended Posts

Clonez la liste Java.
Mémorandum Java (liste)
A propos de la liste des baies Java
[Mémo] Liste liée Java
Clone Java / Twitter / système de gestion des tâches ④ Afficher la liste des tâches
[Java] Conversion de type de liste / type de tableau
Java
[Java] Liste des bibliothèques standard dépendant du système d'exploitation
Agrégation de listes en Java (Collectors.groupingBy)
Java
Liste Java en tant que groupe, tri, etc.
Liste de la structure de données [Java / Scala]
[Java] Supprimer les éléments de la liste
Liste des méthodes Java (mémoire) (en construction)
Trier la liste des objets Java
[Java] Convertir 1 en N liste en carte
Liste des membres ajoutés dans Java 9
[Java] Comment utiliser List [ArrayList]
Traitement de flux d'inversion de liste Java étonnamment profond
Liste des types ajoutés dans Java 9
[Java] Conversion d'un tableau à une liste
Liste de conversion mutuelle de tableau / liste / flux Java
Conversion de liste Java8 avec Stream map
Apprendre Java (0)
Implémentation de la méthode de clonage pour Java Record
Étudier Java ―― 3
Java protégé
[Java] Annotation
Module [Java]
Tableau Java
Étudier Java ―― 9
Java scratch scratch
Astuces Java, astuces
[Java] Obtenir des éléments List / Map avec Iterator
Méthodes Java
Méthode Java
java (constructeur)
Tableau Java
[Java] ArrayDeque
java (remplacement)
Journée Java 2018
Chaîne Java
java (tableau)
Java statique
Sérialisation Java
java débutant 4
JAVA payé
Étudier Java ―― 4
Java (ensemble)
tri shell java
[Java] compareTo
Étudier Java -5
java (interface)
[Java] Comment ajouter des données à la liste (add, addAll)
Mémorandum Java
Tableau Java
Étudier Java ―― 1
[Java] Array