Javaのコンテナのコピーコンストラクタがシャローコピーかディープコピーかは、長い間混乱していますか? 以下は私の理解です。 ints1、ints2、ints3は参照のため、スタックにあります。 inst1はヒープ内のオブジェクトを指し、このオブジェクトはスタックにある3つの匿名参照を保持し、int値が0,1,2のオブジェクトを別々に指します。JavaのArrayListのコピーコンストラクタは、シャローコピーかディープコピーかですか?
ints2 = ints1
したがって、ints2はints1と同じオブジェクトを指します。したがって、ints2のrefenencesによって指される変更オブジェクトは、ints2のものに影響します。
ints2.set(1,0+10)
リペンスints1.get(0)のオブジェクトが変更されます。
ints3 = new ArrayList<>(ints1)
次は私の混乱です。
コピーコンストラクタがシャローコピーの場合、ints1とints3は別のオブジェクトを指しますが、2つのオブジェクトは同じ参照を持ちます。したがって、ints1の参照を操作してオブジェクトを変更するアクションは、同じオブジェクトを指しているためints3を変更します。
コピーコンストラクタがディープコピーの場合、ints1とints3は異なる参照を保持し、異なるオブジェクトを指します。 ints1の変更はint3の変更に影響しません。
結果によると、コピーコンストラクタは、浅いコピーではなくディープコピーであるようです。
誰かが私を訂正することを願っています、ありがとう。
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]
Integerと浅いコピーと深いコピーを混同しないでください。これを読んでください:https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason
ints1とints2は同じオブジェクトを参照していますが、ints3はints1の値を使用して作成された別のオブジェクト。したがって、ints2の変更はints1を変更します。 ints3の変更は他の2つのオブジェクトには影響しません。混乱している場合は、すべてのオブジェクトのハッシュコードを印刷しようとすると、違いを見ることができます。 –