J'ai un List<SomeBean>
qui est rempli à partir d'un service Web. Je souhaite copier / cloner le contenu de cette liste dans une liste vide du même type. Une recherche Google pour copier une liste m'a suggéré d'utiliser la Collections.copy()
méthode. Dans tous les exemples que j'ai vus, la liste de destination était censée contenir le nombre exact d'éléments pour que la copie ait lieu.
Comme la liste que j'utilise est remplie via un service Web et qu'elle contient des centaines d'objets, je ne peux pas utiliser la technique ci-dessus. Ou je l'utilise mal ?? !! Bref, pour que ça marche, j'ai essayé de faire quelque chose comme ça, mais j'en ai quand même un IndexOutOfBoundsException
.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
J'ai essayé d'utiliser le wsListCopy=wsList.subList(0, wsList.size())
mais j'ai obtenu un ConcurrentAccessException
plus tard dans le code. Frappe et procès. :)
Quoi qu'il en soit, ma question est simple, comment puis-je copier tout le contenu de ma liste dans une autre liste? Pas par itération, bien sûr.
la source
app.allInOne(template)
?ArrayList
?Réponses:
Utilisez simplement ceci:
Remarque: toujours pas thread-safe, si vous modifiez à
otherList
partir d'un autre thread, vous voudrez peut-être en faireotherList
(et mêmenewList
) unCopyOnWriteArrayList
, par exemple - ou utiliser une primitive de verrouillage, telle que ReentrantReadWriteLock pour sérialiser l'accès en lecture / écriture à toutes les listes. accédé simultanément.la source
ConcurrentAccessException
.C'est une très belle façon de faire Java 8:
Bien sûr, l'avantage ici est que vous pouvez filtrer et ignorer uniquement une partie de la liste.
par exemple
la source
list
est modifié pendant que le collecteur est en cours d'exécution, unConcurrentModificationException
est lancé..limit(list1.size() - 1)
Veuillez garder à l'esprit chaque fois que vous utilisez la méthode addAll () pour copier, le contenu des références des listes de tableaux (originalArrayList et copyArrayofList) aux mêmes objets sera ajouté à la liste, donc si vous modifiez l'un d'entre eux, copyArrayofList le sera également reflètent le même changement.
Si vous ne voulez pas d'effet secondaire, vous devez copier chaque élément de l'originalArrayList vers le copyArrayofList, comme en utilisant une boucle for ou while.
la source
Cela signifie que vous modifiez la liste pendant que vous essayez de la copier, probablement dans un autre thread. Pour résoudre ce problème, vous devez soit
utilisez une collection conçue pour un accès simultané.
verrouiller la collection de manière appropriée afin que vous puissiez la parcourir (ou vous permettre d'appeler une méthode qui le fait pour vous)
trouver un moyen d'éviter d'avoir à copier la liste originale.
la source
À partir de Java 10 :
List.copyOf()
renvoie unList
élément non modifiable contenant les éléments du donnéCollection
.Le donné
Collection
ne doit pas êtrenull
et ne doit contenir aucunnull
élément.De plus, si vous souhaitez créer une copie complète d'un
List
, vous pouvez trouver de nombreuses bonnes réponses ici .la source
Il existe une autre méthode avec Java 8 de manière sûre pour les valeurs nulles.
Si vous souhaitez ignorer un élément.
Avec Java 9+, la méthode de flux facultative peut être utilisée
la source
J'avais le même problème ConcurrentAccessException et mysolution était de:
Cela ne fonctionne donc qu'une seule opération à la fois et évite l'exeption ...
la source
J'ai essayé quelque chose de similaire et j'ai pu reproduire le problème (IndexOutOfBoundsException). Voici mes conclusions:
1) L'implémentation de Collections.copy (destList, sourceList) vérifie d'abord la taille de la liste de destination en appelant la méthode size (). Puisque l'appel à la méthode size () retournera toujours le nombre d'éléments de la liste (0 dans ce cas), le constructeur ArrayList (capacité) assure uniquement la capacité initiale du tableau de sauvegarde et cela n'a aucun rapport avec le taille de la liste. Par conséquent, nous obtenons toujours IndexOutOfBoundsException.
2) Un moyen relativement simple consiste à utiliser le constructeur qui prend une collection comme argument:
la source
re
indexOutOfBoundsException
:, vos arguments de sous-liste sont le problème; vous devez terminer la sous-liste à la taille 1. Étant de base zéro, le dernier élément d'une liste est toujours size-1, il n'y a pas d'élément dans la position de taille, d'où l'erreur.la source
Vous pouvez utiliser addAll ().
par exemple :
wsListCopy.addAll(wsList);
la source
Je ne vois aucune réponse correcte. Si vous voulez une copie complète, vous devez itérer et copier l'objet manuellement (vous pouvez utiliser un constructeur de copie).
la source
Si vous ne voulez pas que les changements dans une liste affectent une autre liste, essayez ceci. Cela a fonctionné pour moi
J'espère que cela aide.
la source
La fonction subList est une astuce, l'objet retourné est toujours dans la liste d'origine. donc si vous effectuez une opération dans subList, cela provoquera l'exception simultanée dans votre code, qu'il s'agisse d'un thread unique ou d'un multi thread.
la source