Tengo un List<SomeBean>
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 Collections.copy()
método. En todos los ejemplos que vi, se suponía que la lista de destinos debía contener el número exacto 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, intenté hacer algo como esto, pero todavía obtuve 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());
Traté de usar el wsListCopy=wsList.subList(0, wsList.size())
pero obtuve uno ConcurrentAccessException
más tarde en el código. Golpe y juicio. :)
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.
fuente
app.allInOne(template)
?ArrayList
?Respuestas:
Solo usa esto:
Nota: aún no es seguro para subprocesos, si modifica
otherList
desde otro subproceso, entonces es posible que desee hacer esootherList
(e inclusonewList
) unCopyOnWriteArrayList
, por ejemplo, o usar un primitivo de bloqueo, como ReentrantReadWriteLock para serializar el acceso de lectura / escritura a las listas que estén Acceso concurrente.fuente
ConcurrentAccessException
.Esta es una forma muy agradable de Java 8 para hacerlo:
Por supuesto, la ventaja aquí es que puede filtrar y saltar a solo una copia de parte de la lista.
p.ej
fuente
list
se cambia mientras el recopilador se está ejecutando,ConcurrentModificationException
se lanza a..limit(list1.size() - 1)
Tenga en cuenta que siempre que use el método addAll () para copiar, el contenido de las referencias de las listas de matriz (originalArrayList y copyArrayofList) a los mismos objetos se agregará a la lista, por lo que si modifica alguno de ellos, copyArrayofList también Refleja el mismo cambio.
Si no desea efectos secundarios, debe copiar cada uno de los elementos de la OriginalArrayList a la copyArrayofList, como usar un bucle for o while.
fuente
Esto significa que está modificando la lista mientras intenta copiarla, probablemente en otro hilo. Para arreglar esto tienes que
use una colección diseñada para acceso concurrente.
bloquee la colección adecuadamente para que pueda iterar sobre ella (o permitirle llamar a un método que lo haga por usted)
encuentre un lugar alejado para evitar tener que copiar la lista original.
fuente
A partir de Java 10 :
List.copyOf()
devuelve un no modificable queList
contiene los elementos de lo dadoCollection
.Lo dado
Collection
no debe sernull
, y no debe contener ningúnnull
elemento.Además, si desea crear una copia profunda de un
List
, puede encontrar muchas buenas respuestas aquí .fuente
Hay otro método con Java 8 de forma segura.
Si quieres saltarte un elemento.
Con Java 9+, se puede usar el método de transmisión de Opcional
fuente
Estaba teniendo el mismo problema ConcurrentAccessException y mysolution era:
Por lo tanto, funciona solo una operación a la vez y evita la Excepción ...
fuente
Intenté algo similar y pude reproducir el problema (IndexOutOfBoundsException). A continuación se encuentran mis hallazgos:
1) La implementación de Collections.copy (destList, sourceList) primero verifica el tamaño de la lista de destino llamando al método size (). Dado que 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 argumento:
fuente
re:,
indexOutOfBoundsException
sus argumentos de sublista son el problema; debe finalizar la sublista en tamaño-1. Al estar basado en cero, el último elemento de una lista siempre es tamaño-1, no hay ningún elemento en la posición de tamaño, de ahí el error.fuente
Puede usar addAll ().
p.ej :
wsListCopy.addAll(wsList);
fuente
No puedo ver ninguna respuesta correcta. Si desea una copia profunda, debe iterar y copiar el objeto manualmente (podría usar un constructor de copia).
fuente
Si no desea que los cambios en una lista afecten a otra lista, intente esto. Funcionó para mí
Espero que esto ayude.
fuente
La función subList 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 concurrente en su código, sin importar si es un solo hilo o un hilo múltiple.
fuente