2017-12-18 31 views
3

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] 
+2

Integerと浅いコピーと深いコピーを混同しないでください。これを読んでください:https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason

+1

ints1とints2は同じオブジェクトを参照していますが、ints3はints1の値を使用して作成された別のオブジェクト。したがって、ints2の変更はints1を変更します。 ints3の変更は他の2つのオブジェクトには影響しません。混乱している場合は、すべてのオブジェクトのハッシュコードを印刷しようとすると、違いを見ることができます。 –

答えて

関連する問題