162 votes

Comment copier une liste java.util.List dans une autre liste java.util.List ?

J'ai un List<SomeBean> qui est alimenté à partir d'un service Web. Je veux copier/cloner le contenu de cette liste dans une liste vide du même type. Une recherche sur Google pour copier une liste m'a suggéré d'utiliser 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 alimentée par un service web et qu'elle contient des centaines d'objets, je ne peux pas utiliser la technique ci-dessus. Ou bien je l'utilise mal ??! Quoi qu'il en soit, pour que cela fonctionne, j'ai essayé de faire quelque chose comme ceci, mais j'ai toujours un message d'erreur 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. Un coup d'essai :)

Quoi qu'il en soit, ma question est simple, comment puis-je copier l'intégralité du contenu de ma liste dans une autre liste ? Pas par itération, bien sûr.

271voto

fge Points 40850

Utilisez juste ça :

List<SomeBean> newList = new ArrayList<SomeBean>(otherList);

Note : toujours pas thread safe, si vous modifiez otherList d'un autre fil de discussion, alors vous voudrez peut-être faire de cette otherList (et même newList ) a CopyOnWriteArrayList par exemple - ou utiliser une primitive de verrouillage, telle que RéentrantReadWriteLock pour sérialiser l'accès en lecture/écriture à toutes les listes auxquelles on accède simultanément.

38voto

Dan Points 1593

C'est une façon très agréable de le faire en Java 8 :

List<String> list2 = list1.stream().collect(Collectors.toList());

Bien sûr, l'avantage ici est que vous pouvez filtrer et passer à la copie d'une partie seulement de la liste.

par exemple

//don't copy the first element 
List<String> list2 = list1.stream().skip(1).collect(Collectors.toList());

24voto

Divyesh Kanzariya Points 1864
originalArrayList.addAll(copyArrayofList);

Veuillez garder à l'esprit que lorsque vous utilisez le addAll() pour la copie, le contenu des deux listes de tableaux (originalArrayList et copyArrayofList) les références aux mêmes objets seront ajoutées à la liste, donc si vous modifiez l'un d'entre eux, copyArrayofList reflétera également le même changement.

Si vous ne voulez pas d'effet secondaire, vous devez copier chaque élément de l'originalArrayList vers le copyArrayofList, en utilisant une boucle for ou while. Pour une copie profonde, vous pouvez utiliser le code ci-dessous.

mais il y a encore une chose que vous devez faire, implémenter la fonction Cloneable et remplacer l'interface clone() pour la classe SomeBean.

public static List<SomeBean> cloneList(List<SomeBean> originalArrayList) {
    List<SomeBean> copyArrayofList = new ArrayList<SomeBean>(list.size());
    for (SomeBean item : list) copyArrayofList.add(item.clone());
    return copyArrayofList;
}

7voto

Peter Lawrey Points 229686

J'ai essayé de faire quelque chose comme ça, mais j'ai toujours une IndexOutOfBoundsException.

J'ai obtenu une ConcurrentAccessException

Cela signifie que vous modifiez la liste pendant que vous essayez de la copier, très probablement dans un autre fil. Pour résoudre ce problème, vous devez soit

  • utiliser une collection qui est conçue pour un accès simultané.

  • verrouiller la collection de manière appropriée afin que vous puissiez l'itérer (ou vous permettre d'appeler une méthode qui le fait pour vous).

  • trouver une solution pour éviter d'avoir à copier la liste originale.

7voto

Oleksandr Points 7545

À partir de Java 10 :

List<E> oldList = List.of();
List<E> newList = List.copyOf(oldList);

List.copyOf() renvoie un fichier non modifiable List contenant les éléments du Collection .

Les données Collection ne doit pas être null et il ne doit pas contenir de null éléments.

De même, si vous souhaitez créer une copie profonde d'un fichier List vous pouvez trouver beaucoup de bonnes réponses aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X