Este hecho hace una copia superficial , aquí hay un comentario para clonar, desde el código fuente ArrayList
Devuelve una copia superficial de esta instancia de ArrayList. (Los propios elementos no se copian.)
Para entender esto, vamos a ver un fragmento en el método clone de ArrayList
v.elementData = Arrays.copyOf(elementData, size);
Como sabemos, cuando nos asignar un objeto a una variable, JAVA no hace una copia nueva de ese objeto. En cambio, esta variable se convierte en otra referencia que apunta al Objeto original.
Por lo tanto, elementData en realidad está almacenando referencias a los objetos puestos en este ArrayList. Y clone solo copie estas referencias, no se crean réplicas de objetos.
Por supuesto, puede eliminar o agregar una nueva referencia a una ArrayList clonada.
Sin embargo, la modificación de Objetos antiguos en una ArrayList afectará a la ArrayList original. Es difícil hacer ilustraciones con tu ejemplo, ya que Integer es inmutable.
Para ver el efecto secundario, se puede definir un objeto personalizado mutable
class Person {
private int a;
public void setA(int a) {
this.a = a;
}
public int getA() {
return a;
}
@Override
public String toString() {
return String.valueOf(a);
}
}
continuación, puede utilizar el siguiente código para hacer la prueba
Person p1 = new Person();
Person p2 = new Person();
ArrayList<Person> tt = new ArrayList<Person>();
tt.add(p1);
tt.add(p2);
ArrayList<Person> yy = (ArrayList<Person>) tt.clone();
Person vv = yy.get(yy.indexOf(p2));
vv.setA(12);
yy.remove(p1);
System.out.println("tt: " + tt);
System.out.println("yy: " +yy);
La salida debe ser
tt: [0, 12]
yy: [12]
Vea el efecto secundario :)? Solo cambiamos el elemento en yy, pero también se refleja en tt.
así que cuál es la diferencia entre copia profunda y copia superficial – TimeToCodeTheRoad
es correcto decir que la creación de un clon de una lista que contiene los objetos de clase única mutables , es un desperdicio – TimeToCodeTheRoad
@TimeToCodeTheRoad copia superficial funciona igual que Bozho explicó, copias de copias profundas del ArrayList y sus elementos. Para –