Cómo copiar un java.util.List en otro java.util.List

Tengo una List que se completa desde un servicio web. Quiero copiar / clonar el contenido de esa lista en una lista vacía del mismo tipo. Una búsqueda en Google para copiar una lista me sugirió usar el método Collections.copy() . En todos los ejemplos que vi, se suponía que la lista de destinos contenía la cantidad exacta de elementos para que se realizara la copia.

Como la lista que estoy usando se completa a través de un servicio web y contiene cientos de objetos, no puedo usar la técnica anterior. O lo estoy usando mal? !! De todos modos, para que funcione, traté de hacer algo como esto, pero todavía tengo una IndexOutOfBoundsException .

 List wsList = app.allInOne(template); List wsListCopy=new ArrayList(wsList.size()); Collections.copy(wsListCopy,wsList); System.out.println(wsListCopy.size()); 

Traté de usar wsListCopy=wsList.subList(0, wsList.size()) pero obtuve una ConcurrentAccessException más adelante en el código. Hit y prueba. 🙂

De todos modos, mi pregunta es simple, ¿cómo puedo copiar todo el contenido de mi lista en otra lista? No a través de la iteración, por supuesto.

Solo usa esto:

 List newList = new ArrayList(otherList); 

Nota: aún no es seguro para hilos, si modifica otherList de otro hilo, entonces puede hacer que otherList (e incluso newList ) un CopyOnWriteArrayList , por ejemplo, o usar una primitiva de locking, como ReentrantReadWriteLock para serializar el acceso de lectura / escritura a cualquier lista a la que se acceda simultáneamente.

Esta es una muy buena forma de Java 8 para hacerlo:

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

Por supuesto, la ventaja aquí es que puede filtrar y omitir para copiar solo parte de la lista.

p.ej

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

Traté de hacer algo como esto, pero todavía tengo una excepción IndexOutOfBoundsException.

Recibí una ConcurrentAccessException

Esto significa que está modificando la lista mientras intenta copiarla, muy probablemente en otro hilo. Para arreglar esto tienes que

  • use una colección que está diseñada para acceso concurrente.

  • bloquear la colección de forma adecuada para que pueda iterar sobre ella (o permitirle llamar a un método que hace esto por usted)

  • encuentre una distancia para evitar tener que copiar la lista original.

 originalArrayList.addAll(copyArrayofList); 

Tenga en cuenta que cada vez que use el método addAll () para copiar, el contenido de las listas de matrices (originalArrayList y copyArrayofList) se agregarán a la lista, de modo que si modifica alguno de ellos, también copiarArrayofList también reflejar el mismo cambio

Si no desea efectos colaterales, debe copiar cada elemento de la lista de arreglos original a copyArrayofList, como usar un ciclo for o while.

Estaba teniendo el mismo problema ConcurrentAccessException y mysolution fue para:

 List tempList = new ArrayList<>(); for (CartItem item : prodList) { tempList.add(item); } prodList.clear(); prodList = new ArrayList<>(tempList); 

Por lo tanto, funciona solo una operación en el momento y evita la Excepción …

Intenté algo similar y pude reproducir el problema (IndexOutOfBoundsException). A continuación están mis hallazgos:

1) La implementación de Collections.copy (destList, sourceList) comprueba primero el tamaño de la lista de destinos llamando al método size (). Como la llamada al método size () siempre devolverá el número de elementos en la lista (0 en este caso), el constructor ArrayList (capacidad) asegura solo la capacidad inicial de la matriz de respaldo y esto no tiene ninguna relación con el tamaño de la lista. Por lo tanto, siempre obtenemos IndexOutOfBoundsException.

2) Una forma relativamente simple es usar el constructor que toma una colección como su argumento:

 List wsListCopy=new ArrayList(wsList); 

Hay otro método con Java 8 de una manera nula.

 List wsListCopy = Optional.ofNullable(wsList) .map(List::stream) .orElseGet(Stream::empty) .collect(Collectors.toList()); 

Si quiere omitir un elemento.

 List wsListCopy = Optional.ofNullable(wsList) .map(List::stream) .orElseGet(Stream::empty) .skip(1) .collect(Collectors.toList()); 

No puedo ver ninguna respuesta correcta. Si desea una copia profunda, debe iterar y copiar el objeto manualmente (puede usar un constructor de copia).

re: indexOutOfBoundsException , tus indexOutOfBoundsException sublista son el problema; necesita finalizar la sublista en tamaño-1. Siendo de base cero, el último elemento de una lista es siempre size-1, no hay ningún elemento en la posición de tamaño, de ahí el error.

Puede usar addAll ().

por ejemplo: wsListCopy.addAll(wsList);

Si necesita copiar parte de la lista

 List list2 = itemList.subList(0, 9); 

En Java 10 :

 List newList = List.copyOf(oldList); 

List.copyOf() devuelve una List no modificable que contiene los elementos de la Collection dada.

La Collection dada no debe ser null y no debe contener ningún elemento null .

Si no quiere cambios en una lista para efectuar otra, intente esto. Funcionó para mí
Espero que esto ayude.

  public class MainClass { public static void main(String[] a) { List list = new ArrayList(); list.add("A"); List list2 = ((List) ((ArrayList) list).clone()); System.out.println(list); System.out.println(list2); list.clear(); System.out.println(list); System.out.println(list2); } } > Output: [A] [A] [] [A] 

la función sublista es un truco, el objeto devuelto todavía está en la lista original. por lo tanto, si realiza alguna operación en subList, causará la excepción simultánea en su código, sin importar si se trata de un solo hilo o multi hilo.