Tengo una ArrayList l1de tamaño 10. Asigno l1al nuevo tipo de referencia de lista l2. Will l1y l2apunta al mismo ArrayListobjeto? ¿O se le ArrayListasigna una copia del objeto l2?
Cuando uso la l2referencia, si actualizo el objeto de la lista, también refleja los cambios en el l1tipo 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.subListpara 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.copyno es en absoluto una alternativa anew ArrayList<>(source). Lo queCollections.copyrealmente 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í
l1yl2apuntará a la misma referencia, el mismo objeto.Si desea crear una nueva ArrayList basada en la otra ArrayList, haga esto:
El resultado será
l1que todavía tendrá 2 elementos yl2tendrá 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.ofmétodos para usar literales para crear unaListclase concreta inmodificable de desconocida.Junto con eso también tenemos
List.copyOf. Este método también devuelve unaListclase 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.copyOfmé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 usandoStringobjetos 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
colorses 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 otrosStringcomoOliveDraboCornflowerBlue.En contraste, los cuatro elementos de
masterColorsson fijos. Sin eliminación, sin adición y sin sustitución de otro color. EsaListimplementación no se puede modificar.fuente