Question

J'ai un ArrayList<String> que j'aimerais retourner une copie de. ArrayList a une méthode clone qui a la signature suivante:

public Object clone()

Après j'appelle cette méthode, comment puis-je convertir l'Objet retourné en arrière pour ArrayList<String>?

Était-ce utile?

La solution

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

Autres conseils

Pourquoi voudriez-vous clone?La création d'une nouvelle liste généralement plus de sens.

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

Le travail est accompli.

C'est le code que j'utilise pour que:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

L'espoir est utile pour vous

Avec Java 8, il peut être cloné avec un ruisseau.

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());

Être informé de l'Objet.clone() a quelques problèmes majeurs, et son utilisation est déconseillée dans la plupart des cas.Veuillez consulter l'Article 11, à partir de "Efficace Java"par Joshua Bloch pour une réponse complète.Je crois que vous pouvez utiliser en toute sécurité des Objets.clone() de type primitif, des tableaux, mais en dehors de cela, vous devez être judicieux dans le choix d'utilisation et de primordial clone.Vous êtes probablement mieux de la définition d'un constructeur de copie ou d'un statique méthode de fabrique explicitement les clones de l'objet en fonction de votre sémantique.

Je pense que cela devrait faire l'affaire à partir des Collections de l'API:

Note:la méthode de copie s'exécute en temps linéaire.

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);

- Je trouver de l'aide addAll fonctionne très bien.

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);

les parenthèses sont utilisées plutôt que les génériques de syntaxe

Si vous voulez afin d'être en mesure de retourner la Liste de lecture, il serait préférable de le faire:

ImmutableList.copyOf(list);

Pour cloner une interface générique, comme java.util.List vous aurez juste besoin de le jeter.voici un exemple:

List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());

C'est un peu délicat, mais il fonctionne, si vous êtes limité à un retour List interface, de sorte que personne après vous pouvez mettre en œuvre votre liste quand il le veut.

Je sais que cette réponse est proche de la réponse finale, mais ma réponse les réponses, comment faire tout cela pendant que vous travaillez avec List -le générique parent - pas ArrayList

Soyez très prudent lors de clonage ArrayLists.Le clonage en java est peu profonde.Cela signifie que seul un clone de la liste de tableaux lui-même, et non ses membres.Donc, si vous avez une liste de tableaux X1 et le clone en X2 tout changement dans X2 également manifeste dans X1 et vice-versa.Lorsque vous clonez vous ne fera que générer une nouvelle liste de tableaux avec des pointeurs vers les mêmes éléments de l'original.

Cela devrait aussi fonctionner:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

Je ne suis pas un java professionnel, mais j'ai le même problème et j'ai essayé de résoudre par cette méthode.(On suppose que T est un constructeur de copie).

 public static <T extends Object> List<T> clone(List<T> list) {
      try {
           List<T> c = list.getClass().newInstance();
           for(T t: list) {
             T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
             c.add(copy);
           }
           return c;
      } catch(Exception e) {
           throw new RuntimeException("List cloning unsupported",e);
      }
}
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

Gardez à l'esprit que c'est seulement un peu pas une copie en profondeur, c'est à dire.vous obtenez une nouvelle liste, mais les entrées sont les mêmes.Ce n'est pas un problème pour simplement des chaînes de caractères.Obtenez plus délicate lorsque les entrées de la liste sont des objets eux-mêmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top