Eu tenho um List<SomeBean>
que é preenchido a partir de um serviço da Web. Quero copiar / clonar o conteúdo dessa lista em uma lista vazia do mesmo tipo. Uma pesquisa no Google para copiar uma lista sugeriu que eu usasse o Collections.copy()
método Em todos os exemplos que vi, a lista de destinos deveria conter o número exato de itens para a cópia ocorrer.
Como a lista que estou usando é preenchida por um serviço da Web e contém centenas de objetos, não posso usar a técnica acima. Ou eu estou usando errado ?? !! De qualquer forma, para fazê-lo funcionar, tentei fazer algo assim, mas ainda consegui IndexOutOfBoundsException
.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
Tentei usar o wsListCopy=wsList.subList(0, wsList.size())
mas obtive um ConcurrentAccessException
código mais tarde. Sucesso e julgamento. :)
Enfim, minha pergunta é simples, como posso copiar todo o conteúdo da minha lista em outra lista? Não através da iteração, é claro.
fonte
app.allInOne(template)
?ArrayList
?Respostas:
Apenas use isto:
Nota: ainda não é seguro para threads, se você modificar a
otherList
partir de outro thread, convém tornar issootherList
(e aténewList
) umCopyOnWriteArrayList
, por exemplo - ou usar uma primitiva de bloqueio, como ReentrantReadWriteLock, para serializar o acesso de leitura / gravação a qualquer lista. acessado simultaneamente.fonte
ConcurrentAccessException
.Esta é uma ótima maneira do Java 8:
Obviamente, a vantagem aqui é que você pode filtrar e pular para copiar apenas parte da lista.
por exemplo
fonte
list
seja alterado enquanto o coletor estiver em execução, aConcurrentModificationException
será lançada..limit(list1.size() - 1)
Lembre-se de sempre que usar o método addAll () para copiar, o conteúdo das referências das listas de matriz (originalArrayList e copyArrayofList) aos mesmos objetos será adicionado à lista; portanto, se você modificar qualquer um deles, o copyArrayofList também será refletem a mesma mudança.
Se você não quiser efeito colateral, precisará copiar cada elemento do originalArrayList para o copyArrayofList, como usar um loop for ou while.
fonte
Isso significa que você está modificando a lista enquanto tenta copiá-la, provavelmente em outro segmento. Para consertar isso, você deve
use uma coleção projetada para acesso simultâneo.
bloqueie a coleção adequadamente para que você possa iterá-la (ou permitir que você chame um método que faça isso por você)
encontre uma distância para evitar a necessidade de copiar a lista original.
fonte
A partir do Java 10 :
List.copyOf()
retorna um não modificávelList
contendo os elementos do dadoCollection
.O dado
Collection
não deve sernull
e não deve conter nenhumnull
elemento.Além disso, se você deseja criar uma cópia profunda de a
List
, pode encontrar muitas boas respostas aqui .fonte
Há outro método com o Java 8 de maneira segura para nulos.
Se você quiser pular um elemento.
Com o Java 9+, o método de fluxo de Opcional pode ser usado
fonte
Eu estava tendo o mesmo problema ConcurrentAccessException e mysolution:
Portanto, ele funciona apenas uma operação por vez e evita a exceção ...
fonte
Tentei algo semelhante e consegui reproduzir o problema (IndexOutOfBoundsException). Abaixo estão minhas descobertas:
1) A implementação do Collections.copy (destList, sourceList) primeiro verifica o tamanho da lista de destinos chamando o método size (). Como a chamada para o método size () sempre retornará o número de elementos na lista (0 neste caso), o construtor ArrayList (capacidade) garante apenas a capacidade inicial da matriz de backup e isso não tem nenhuma relação com o tamanho da lista. Portanto, sempre obtemos IndexOutOfBoundsException.
2) Uma maneira relativamente simples é usar o construtor que usa uma coleção como argumento:
fonte
re
indexOutOfBoundsException
:, seus argumentos da sub-lista são o problema; você precisa finalizar a sublist no tamanho 1. Sendo baseado em zero, o último elemento de uma lista é sempre o tamanho 1, não há elemento na posição do tamanho, daí o erro.fonte
Você pode usar addAll ().
por exemplo :
wsListCopy.addAll(wsList);
fonte
Não consigo ver nenhuma resposta correta. Se você quiser uma cópia profunda, precisará iterar e copiar o objeto manualmente (você pode usar um construtor de cópias).
fonte
Se você não deseja que alterações em uma lista efetuem outra, tente isso. Funcionou para mim
Espero que isso ajude.
fonte
função subList é um truque, o objeto retornado ainda está na lista original. portanto, se você executar qualquer operação na subList, ela causará a exceção simultânea no seu código, independentemente de ser um único thread ou vários threads.
fonte