J'en ai un ArrayList<String>
dont je voudrais renvoyer une copie. ArrayList
a une méthode de clonage qui a la signature suivante:
public Object clone()
Après avoir appelé cette méthode, comment convertir l'objet renvoyé en retour ArrayList<String>
?
Réponses:
la source
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
.List<String>
plutôt queArrayList<String>
sur le côté gauche. C'est ainsi que les collections doivent être utilisées la plupart du temps.Pourquoi voudriez-vous cloner? Créer une nouvelle liste est généralement plus logique.
Travail accompli.
la source
ArrayList(Collection<? extends E> c)
signifie que le type de liste que vous utilisez comme argument n'a pas d'importance.Voici le code que j'utilise pour cela:
L'espoir est utile pour vous
la source
ArrayList
utiliserArrayList<YourObject>
ArrayList
constructeur?Avec Java 8, il peut être cloné avec un flux.
...
la source
toCollection
peut être un meilleur choix.Sachez que Object.clone () a des problèmes majeurs et que son utilisation est déconseillée dans la plupart des cas. Veuillez consulter le point 11, tiré de « Effective Java » de Joshua Bloch pour une réponse complète. Je pense que vous pouvez utiliser Object.clone () en toute sécurité sur des tableaux de type primitif, mais en dehors de cela, vous devez être judicieux pour utiliser et remplacer correctement le clone. Il vaut probablement mieux définir un constructeur de copie ou une méthode de fabrique statique qui clone explicitement l'objet en fonction de votre sémantique.
la source
Je pense que cela devrait faire l'affaire en utilisant l'API Collections:
Remarque : la méthode de copie s'exécute en temps linéaire.
la source
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
Il semble que l'utilisationcopyList.addAll(original);
soit une bonne alternativeint
arguments mystérieux . Je ne sais pas pourquoi vous voulez utiliser cette méthode statique obscure au lieu du bon vieux tempsaddAll
.Je trouve que l'utilisation d'addAll fonctionne bien.
les parenthèses sont utilisées plutôt que la syntaxe générique
la source
new ArrayList<String>(original)
?Si vous le souhaitez pour pouvoir renvoyer la liste dans un getter, il vaut mieux faire:
la source
Pour cloner une interface générique comme il
java.util.List
vous suffit de la lancer. voici un exemple:C'est un peu délicat, mais cela fonctionne, si vous êtes limité à renvoyer un
List
interface, donc n'importe qui après vous peut implémenter votre liste quand il le souhaite.Je sais que cette réponse est proche de la réponse finale, mais ma réponse explique comment faire tout cela pendant que vous travaillez avec
List
-le parent générique- nonArrayList
la source
Soyez très prudent lorsque vous clonez des ArrayLists. Le clonage en java est superficiel. Cela signifie qu'il ne clonera que l'Arraylist lui-même et non ses membres. Donc, si vous avez une ArrayList X1 et que vous la clonez dans X2, tout changement dans X2 se manifestera également dans X1 et vice-versa. Lorsque vous clonez, vous ne générez qu'une nouvelle ArrayList avec des pointeurs vers les mêmes éléments dans l'original.
la source
Cela devrait également fonctionner:
la source
Gardez à l'esprit que ce n'est qu'une copie superficielle et non profonde, c'est-à-dire. vous obtenez une nouvelle liste, mais les entrées sont les mêmes. Ce n'est pas un problème pour les chaînes simples. Get est plus délicat lorsque les entrées de la liste sont elles-mêmes des objets.
la source
la source
Je ne suis pas un professionnel java, mais j'ai le même problème et j'ai essayé de le résoudre par cette méthode. (Cela suppose que T a un constructeur de copie).
la source
List
classe d'implémentation a un constructeur public sans argument. Par exemple, leList
s renvoie parArray.asList
,List.of
ouList.subList
probablement pas.