Diese in der Tat hat eine flache Kopie , hier ist ein Kommentar für Klon, aus ArrayList Quellcode
Gibt eine flache Kopie dieser ArrayList-Instanz zurück. (Die Elemente selbst werden nicht kopiert.)
Um dies zu verstehen, wollen wir uns ein Snippet in Klon-Methode suchen von Arraylist
v.elementData = Arrays.copyOf(elementData, size);
Wie wir wissen, wenn wir ein Objekt auf eine Variable, JAVA zuweisen macht keine brandneue Kopie von dieses Objekt. Stattdessen wird diese Variable zu einer anderen Referenz, die auf das ursprüngliche Objekt verweist.
Daher speichert ElementData tatsächlich Referenz auf Objekte in dieser ArrayList. Und klonen Sie einfach kopieren Sie diese Referenzen, keine Repliken von Objekten erstellt werden.
Natürlich können Sie einen neuen Verweis auf eine geklonte ArrayList entfernen oder hinzufügen.
Die Änderung alter Objekte in einer ArrayList wirkt sich jedoch auf die ursprüngliche ArrayList aus. Es ist schwierig, Illustrationen mit Ihrem Beispiel zu erstellen, da Integer unveränderlich ist.
den Nebeneffekt zu sehen, können Sie eine benutzerdefinierte veränderbares Objekt
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);
}
}
Dann definieren Sie den folgenden Code verwenden können Test
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);
Der Ausgang
sein sollte machen
tt: [0, 12]
yy: [12]
Sehen Sie die Nebenwirkung :)? Wir ändern nur das Element in yy, aber es spiegelt sich auch in tt wider.
so lesen, was ist der Unterschied zwischen tiefer Kopie und flacher Kopie – TimeToCodeTheRoad
ist es richtig zu sagen, dass ein Klon einer Liste erstellen nur wandelbar Klassenobjekte enthält, , ist eine Verschwendung. – TimeToCodeTheRoad
@TimeToCodeTheRoad flache Kopie funktioniert genau wie Bozho erklärt, tiefe Kopie kopiert die ArrayList und ihre Elemente. –