2017-12-18 8 views
3

Ich bin schon lange verwirrt, ob der Copy-Konstruktor des Java-Containers flache Kopie oder tiefe Kopie ist? Unten ist mein Verständnis: Ints1, Ints2, Ints3 sind Referenzen, so dass sie im Stapel liegen. inst1 zeigt auf ein Objekt im Heap, und dieses Objekt enthält drei anonyme Referenzen, die im Stapel liegen. Sie zeigen auf Objekte mit dem int-Wert 0, 1, 2.Ist der Kopierkonstruktor von Java's ArrayList flache Kopie oder tiefe Kopie?

ints2 = ints1 

also zeigt ints2 auf das gleiche Objekt wie ints1. Das Ändern von Objekten, die durch Referenzen in ints2 gezeigt werden, beeinflusst die in ints2.

wird refenence ints1.get (0) 's Objekt ändern.

ints3 = new ArrayList<>(ints1) 

Als nächstes ist meine Verwirrung.

Wenn der Copy-Konstruktor eine flache Kopie ist, obwohl ints1 und ints3 auf ein anderes Objekt zeigen, haben die beiden Objekte dieselben Referenzen! Jede Aktion zum Ändern von Objekten durch Verändern der Referenz in ints1 ändert daher ints3, da sie auf dieselben Objekte verweisen.

Wenn der Kopierkonstruktor eine tiefe Kopie ist, enthalten ints1 und ints3 verschiedene Referenzen und verweisen auf verschiedene Objekte. Dann wird die Änderung in ints1 das in ints3 nicht beeinflussen.

Entsprechend dem Ergebnis scheint es, dass der Kopierkonstruktor eine tiefe Kopie ist, keine seichte Kopie.

Hoffe jemand kann mich korrigieren, danke.

import java.util.*; 
public class MyClass { 
    public static void main(String args[]) { 
     List<Integer> ints1 = new ArrayList<>(Arrays.asList(0,1,2)); 
     System.out.println(ints1); 
     List<Integer> ints2 = ints1; 
     ints2.set(0,0+10); 
     System.out.println(ints1); 
     List<Integer> ints3 = new ArrayList<>(ints1); 
     ints3.set(1,1+10); 
     System.out.println(ints1); 
    } 
} 
result 
[0, 1, 2] 
[10, 1, 2] 
[10, 1, 2] 
+2

Verwechseln Sie nicht die Unveränderlichkeit von Integer mit flachen vs tiefe Kopien. Lesen Sie hierzu: https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason

+1

ints1 und ints2 referenzieren die gleichen Objekte, während ints3 ist a separates Objekt, das mit Werten in ints1 erstellt wurde. Alle Änderungen in ints2 werden also ints1 ändern. aber Änderungen in ints3 werden nicht andere zwei Objekte beeinflussen .. Wenn Sie Verwirrung haben, versuchen Sie, Hashcode aller Objekte zu drucken, können Sie den Unterschied dann sehen .. –

Antwort

Verwandte Themen