Tengo una ArrayList
l1
de tamaño 10. Asigno l1
al nuevo tipo de referencia de lista l2
. Will l1
y l2
apunta al mismo ArrayList
objeto? ¿O se le ArrayList
asigna una copia del objeto l2
?
Cuando uso la l2
referencia, si actualizo el objeto de la lista, también refleja los cambios en el l1
tipo de referencia.
Por ejemplo:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
¿No hay otra manera de asignar una copia de un objeto de lista a una nueva variable de referencia, además de crear 2 objetos de lista y hacer una copia en colecciones de lo antiguo a lo nuevo?
List.subList
para obtener una "vista" en una sección de la lista original.(ArrayList<ArrayList<Object>>)
? ¿esto crearía recursivamente copias de todos los objetos hijos de ArrayList?Tratar de usar
Collections.copy(destination, source);
fuente
new ArrayList<>(source);
?Collections.copy
no es en absoluto una alternativa anew ArrayList<>(source)
. Lo queCollections.copy
realmente hace es asumir quedestination.size()
es al menos tan grande comosource.size()
, y luego copiar el rango índice por índice usando elset(int,E)
método El método no agrega nuevos elementos al destino. Consulte el código fuente si no está lo suficientemente claro en el Javadoc.Sí
l1
yl2
apuntará a la misma referencia, el mismo objeto.Si desea crear una nueva ArrayList basada en la otra ArrayList, haga esto:
El resultado será
l1
que todavía tendrá 2 elementos yl2
tendrá 3 elementos.fuente
List<String> l2 = new ArrayList<String>(l1)
yList<String> l2 = l1
?Otra forma conveniente de copiar los valores de src ArrayList a dest Arraylist es la siguiente:
Esta es una copia real de valores y no solo una copia de referencia.
fuente
Hay un método addAll () que servirá para copiar One ArrayList a otro.
Por ejemplo, tiene dos listas de matrices : sourceList y targetList , use el código a continuación.
targetList.addAll (sourceList);
fuente
Java no pasa objetos, pasa referencias (punteros) a objetos. Entonces sí, l2 y l1 son dos punteros al mismo objeto.
Debe hacer una copia explícita si necesita dos listas diferentes con el mismo contenido.
fuente
List.copyOf
➙ lista no modificableTu preguntaste:
Java 9 trajo los
List.of
métodos para usar literales para crear unaList
clase concreta inmodificable de desconocida.Junto con eso también tenemos
List.copyOf
. Este método también devuelve unaList
clase de hormigón desconocido no modificable .Por "no modificable" nos referimos al número de elementos en la lista, y el referente del objeto que se mantiene en cada espacio como elemento, es fijo. No puede agregar, quitar o reemplazar elementos. Pero el referente del objeto contenido en cada elemento puede o no ser mutable .
Vea este código en vivo en IdeOne.com .
Preguntaste sobre referencias de objetos. Como otros dijeron, si crea una lista y la asigna a dos variables de referencia (punteros), todavía tiene solo una lista. Ambos apuntan a la misma lista. Si usa cualquiera de los punteros para modificar la lista, ambos punteros verán más tarde los cambios, ya que solo hay una lista en la memoria.
Entonces necesita hacer una copia de la lista. Si desea que esa copia no sea modificable, utilice el
List.copyOf
método como se describe en esta Respuesta. En este enfoque, terminas con dos listas separadas, cada una con elementos que contienen una referencia a los mismos objetos de contenido. Por ejemplo, en nuestro ejemplo anterior usandoString
objetos para representar colores, los objetos de color están flotando en alguna parte de la memoria. Las dos listas contienen punteros a los mismos objetos de color. Aquí hay un diagrama.La primera lista
colors
es modificable. Esto significa que algunos elementos podrían eliminarse como se ve en el código anterior, donde eliminamos el tercer elemento originalChartreuse
(índice de 2 = ordinal 3). Y se pueden agregar elementos. Y los elementos se pueden cambiar para que apunten a otrosString
comoOliveDrab
oCornflowerBlue
.En contraste, los cuatro elementos de
masterColors
son fijos. Sin eliminación, sin adición y sin sustitución de otro color. EsaList
implementación no se puede modificar.fuente