Tengo algunas estructuras de datos y me gustaría usar una como temporal y otra como no temporal.
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();
ahora el problema con esto, por supuesto, es que en myObject
realidad solo está apuntando myTempObject
, y una vez que myTempObject
se borra, también lo es myObject
.
¿Cómo conservo los valores myTempObject
al myObject
usar java?
List.addAll
. Pero si necesita conservar todos los objetos, borrar la lista temporal no va a borrar mucha memoria. Debido a que solo está tratando de borrar las referencias, en cuanto a los objetos, está tratando de mantenerlos.Respuestas:
Puedes usar ese truco:
myObject = new ArrayList<Object>(myTempObject);
o usar
Puede obtener información sobre el método clone () aquí
Pero debes recordar que todas estas formas te darán una copia de tu Lista , no todos sus elementos. Entonces, si cambia uno de los elementos en su Lista copiada, también se cambiará en su Lista original.
fuente
Object
él, siempre lo asignará por referencia. Por ciertoclone()
es una copia superficial y no copiará el contenidoObjects
sino más bien referencias a ellos. Si desea hacer una copia profunda, eche un vistazo a: stackoverflow.com/questions/64036/…oldList = newList
?originalArrayList. addAll (copyArrayList);
Nota : cuando se usa el método addAll () para copiar, el contenido de ambas listas de matrices (originalArrayList y copyArrayList) se refieren a los mismos objetos o contenidos. Entonces, si modifica cualquiera de ellos, el otro también reflejará el mismo cambio.
Si no quiere esto, entonces necesita copiar cada elemento de originalArrayList a copyArrayList, como usar un bucle for o while.
fuente
No hay copias implícitas realizadas en Java a través del operador de asignación. Las variables contienen un valor de referencia (puntero) y cuando las usa
=
, solo está manejando ese valor.Para preservar el contenido
myTempObject
, necesitará hacer una copia.Esto se puede hacer creando un nuevo
ArrayList
usando el constructor que toma otroArrayList
:ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Editar: Como Bohemian señala en los comentarios a continuación, ¿es esto lo que estás preguntando? Al hacer lo anterior, tanto
ArrayList
s (myTempObject
ymyObject
) contendrían referencias a los mismos objetos. Si realmente desea una nueva lista que contenga nuevas copias de los objetos contenidos enmyTempObject
ella, deberá hacer una copia de cada objeto individual en el original.ArrayList
fuente
clear()
alArrayList
myTempObject
no tendría ningún efecto en los objetos que contiene. Si quería nuevas copias de los objetos contenidos en la lista, esa es otra historia, pero eso no es lo que interpreté como esta pregunta.Encontré esto mientras enfrentaba el mismo problema.
Decir arraylist1 = arraylist2 establece que ambos apunten al mismo lugar, por lo que si modifica alguno de los datos, los datos se alteran y, por lo tanto, ambas listas permanecen siempre iguales.
Para copiar valores en una lista independiente, solo usé foreach para copiar el contenido:
ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList();
complete list1 de la forma que esté actualmente.
fuente
Suponga que desea copiar oldList en un nuevo objeto ArrayList llamado newList
ArrayList<Object> newList = new ArrayList<>() ; for (int i = 0 ; i<oldList.size();i++){ newList.add(oldList.get(i)) ; }
Estas dos listas son independientes, los cambios en una no se reflejan en la otra.
fuente
Probemos el ejemplo
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()); }
En salida impresa como se muestra a continuación
Uno
dos
tres
cuatro
cinco
seis
También podemos hacerlo usando el método clone () para el cual se usa para crear una copia exacta
para ese intento puedes intentarlo como quieras
**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()); }**
fuente
Necesitas
clone()
el objeto individual.Constructor
y otros métodos realizan copias superficiales. Puede probar el método Collections.copy .fuente
Collections.copy
está roto. Primero, es engañoso decir que copia elementos, mientras que solo hace referencia a ellos en una nueva lista. En segundo lugar, ya debe tener una lista de destinos con un tamaño no inferior al de la lista de origen ...Una forma sencilla de hacer una copia profunda de la lista original es agregar todos los elementos de una lista a otra lista.
ArrayList<Object> originalList = new ArrayList<Object>(); ArrayList<Object> duplicateList = new ArrayList<Object>(); for(Object o : originalList) { duplicateList.add(o); }
Ahora, si realiza algún cambio en originalList, no afectará a duplicateList.
fuente
para copiar una lista en la otra lista, puede usar el método llamado Collection.copy (myObject myTempObject). Ahora, después de ejecutar esta línea de código, puede ver todos los valores de la lista en myObject.
fuente
ArrayList<List1> list1= new ArrayList<>(); ArrayList<List1> list2= new ArrayList<>(); //this will your copy your list1 into list2 list2.addAll(list1);
fuente
Aquí hay una solución para copiar todos los objetos de una lista de matrices a otra:
ArrayList<Object> myObject = new ArrayList<Object>(); ArrayList<Object> myTempObject = new ArrayList<Object>(); myObject.addAll(myTempObject.subList(0, myTempObject.size()));
subList está destinado a devolver una lista con un rango de datos. para que pueda copiar todo el arrayList o parte de él.
fuente
Suponga que tiene dos listas de matrices de tipo String. Me gusta
ArrayList<String> firstArrayList ;//This array list is not having any data. ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.
Ahora tenemos que copiar los datos de la segunda matriz a la primera lista de matrices como esta,
firstArrayList = new ArrayList<>(secondArrayList );
¡¡Hecho!!
fuente