Como copio o conteúdo de um ArrayList para outro?

85

Tenho algumas estruturas de dados e gostaria de usar uma como temporária e outra como não temporária.

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();

agora o problema com isso, é claro, é que na myObjectverdade está apenas apontando myTempObject, e assim que myTempObjectestiver limpo, assim será myObject.

Como retenho os valores myTempObjectao myObjectusar java?

CQM
fonte
Você pode usar List.addAll. Mas se você precisar reter todos os objetos, limpar a lista temporária não limpará realmente muita memória. Porque você está apenas tentando limpar as referências, no que diz respeito aos objetos, você está tentando mantê-los.
Bhesh Gurung
Pelo que eu sei, esta resposta ainda é válida: stackoverflow.com/questions/715650/…
home
2
É difícil interpretar o que você realmente está tentando alcançar. Você precisa explicar sua situação.
Bhesh Gurung

Respostas:

141

Você pode usar esse truque:

myObject = new ArrayList<Object>(myTempObject);

ou usar

myObject = (ArrayList<Object>)myTempObject.clone();

Você pode obter algumas informações sobre o método clone () aqui

Mas você deve se lembrar de que todas essas formas fornecerão uma cópia de sua Lista , não de todos os seus elementos. Portanto, se você alterar um dos elementos da Lista copiada, ele também será alterado na Lista original.

Artem
fonte
7
atribuir por valor em Java é algo reservado para tipos primitivos (int, byte, char, etc.) e literais. A menos que você diga explicitamente ao Java para copiar algo que é derivado Objectdele, sempre será atribuído por referência. A propósito, clone()é uma cópia superficial e não copiará o contido, Objectsmas sim referências a eles. Se você quiser fazer uma cópia profunda, dê uma olhada em: stackoverflow.com/questions/64036/…
PeterT
@PeterT - Java é chamado e atribuído por valor. Variáveis ​​de tipo não primitivo contêm valores de referência que são atribuídos ou passados.
Brian Roach
Por favor, por que não posso fazer oldList = newList?
X09 de
2
@ X09 oldList = newList irá copiar a referência de newList para oldList, qualquer mudança em newList será refletida na oldList também. Esse não é o comportamento pretendido.
Sreekanth Karumanaghat
42

originalArrayList. addAll (copyArrayList);

Observação : ao usar o método addAll () para copiar, o conteúdo de ambas as listas de array (originalArrayList e copyArrayList) refere-se aos mesmos objetos ou conteúdo. Portanto, se você modificar qualquer um deles, o outro também refletirá a mesma alteração.

Se você não quiser isso, então você precisa copiar cada elemento do originalArrayList para o copyArrayList, como usar um loop for ou while.

Dhananjay M
fonte
1
Como parar de afetar outra lista existe alguma outra maneira de lidarmos com isso
Mahesh
@Mahesh - consulte stackoverflow.com/questions/715650/…
KrishPrabakar
17

Não há cópias implícitas feitas em java por meio do operador de atribuição. As variáveis ​​contêm um valor de referência (ponteiro) e quando você usa, =você está apenas copiando esse valor.

A fim de preservar o conteúdo de myTempObjectvocê precisaria fazer uma cópia dele.

Isso pode ser feito criando um novo ArrayListusando o construtor que leva outro ArrayList:

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

Edit: Como Bohemian aponta nos comentários abaixo, é isso que você está perguntando? Fazendo o acima, ambos ArrayLists ( myTempObjecte myObject) conteriam referências aos mesmos objetos. Se você realmente quiser uma nova lista que contenha novas cópias dos objetos contidos em myTempObject, você precisará fazer uma cópia de cada objeto individual no originalArrayList

Brian Roach
fonte
1
Nesse caso, funcionaria bem, pois chamar clear()o ArrayList myTempObjectnão teria efeito sobre os objetos nele contidos. Se ele queria novas cópias dos objetos contidos na lista, isso é outra história, mas não é isso que eu interpretei esta pergunta.
Brian Roach
Você sabe que eu acho que você está certo. Eu interpretei mal a pergunta. Ele estava preocupado que limpar um limparia o outro. Comentário deletado.
Boêmio
@Bohemian - Acho que foi um comentário justo e editei meu post para refleti-lo. Não considerei essa poderia ser a intenção do OP ao ler sua pergunta.
Brian Roach
@BrianRoach Como fazer uma cópia de um ArrayList dentro de um ArrayList.
Arun
8

Deparei com isso enquanto enfrentava o mesmo problema.

Dizer arraylist1 = arraylist2 define os dois para apontar para o mesmo lugar, portanto, se você alterar qualquer um dos dados, as duas listas permanecerão sempre as mesmas.

Para copiar valores em uma lista independente, acabei de usar foreach para copiar o conteúdo:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

preencha a lista1 de qualquer maneira que você esteja atualmente.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}
PaulC
fonte
4

Suponha que você deseja copiar oldList para um novo objeto ArrayList chamado newList

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

Essas duas listas são independentes, as alterações em uma não são refletidas na outra.

Java Main
fonte
4

Vamos tentar o exemplo

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

Na saída de impressão conforme abaixo

Um
Dois
Três
Quatro
Cinco
Seis

Também podemos fazer usando clone () método para o qual é usado para criar uma cópia exata

para essa tentativa, você pode tentar como quiser

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**
Nilam Rajaput
fonte
3

Você precisa clone()do objeto individual. Constructore outros métodos executam cópia superficial. Você pode tentar o método Collections.copy .

adatapost
fonte
Collections.copy está quebrado. Primeiro, é enganoso dizer que copia elementos, embora apenas os faça referência em uma nova lista. Em segundo lugar, você precisa já ter uma lista de destino com tamanho não inferior ao da lista de origem ...
ACV
1

Uma maneira simples de fazer uma cópia profunda da lista original é adicionar todos os elementos de uma lista a outra lista.

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

Agora, se você fizer qualquer alteração em originalList, isso não afetará duplicateList.

Chirag Khimani
fonte
0

para copiar uma lista para a outra lista, você pode usar o método chamado Collection.copy (myObject myTempObject). agora depois de executar essas linhas de código, você pode ver todos os valores da lista em myObject.

Rakhi Jaligama
fonte
0

A cópia de uma lista em segundos é bastante simples, você pode fazer isso conforme abaixo: -

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);
Imran samed
fonte
0

Aqui está uma solução alternativa para copiar todos os objetos de um arrayList para outro:

 ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subList destina-se a retornar uma lista com um intervalo de dados. então você pode copiar a arrayList inteira ou parte dela.

Hassanen
fonte
0

Suponha que você tenha dois arraylist do tipo String. Gostar

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

Agora temos que copiar os dados do segundo array para o primeiro arraylist assim,

firstArrayList = new ArrayList<>(secondArrayList );

Feito!!

Gyan Swaroop Awasthi
fonte