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 myObject
verdade está apenas apontando myTempObject
, e assim que myTempObject
estiver limpo, assim será myObject
.
Como retenho os valores myTempObject
ao myObject
usar java?
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.Respostas:
Você pode usar esse truque:
myObject = new ArrayList<Object>(myTempObject);
ou usar
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.
fonte
Object
dele, sempre será atribuído por referência. A propósito,clone()
é uma cópia superficial e não copiará o contido,Objects
mas sim referências a eles. Se você quiser fazer uma cópia profunda, dê uma olhada em: stackoverflow.com/questions/64036/…oldList = newList
?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.
fonte
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
myTempObject
você precisaria fazer uma cópia dele.Isso pode ser feito criando um novo
ArrayList
usando o construtor que leva outroArrayList
:ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Edit: Como Bohemian aponta nos comentários abaixo, é isso que você está perguntando? Fazendo o acima, ambos
ArrayList
s (myTempObject
emyObject
) conteriam referências aos mesmos objetos. Se você realmente quiser uma nova lista que contenha novas cópias dos objetos contidos emmyTempObject
, você precisará fazer uma cópia de cada objeto individual no originalArrayList
fonte
clear()
oArrayList
myTempObject
nã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.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.
fonte
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.
fonte
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()); }**
fonte
Você precisa
clone()
do objeto individual.Constructor
e outros métodos executam cópia superficial. Você pode tentar o método Collections.copy .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 ...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.
fonte
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.
fonte
ArrayList<List1> list1= new ArrayList<>(); ArrayList<List1> list2= new ArrayList<>(); //this will your copy your list1 into list2 list2.addAll(list1);
fonte
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.
fonte
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!!
fonte