2016-12-25 8 views
3

参照の配列をコピーすることについて読んでいました。参照の配列をコピーする

Object[] obj1 = {new Integer(11), 
        new StringBuffer("foobar"), 
        new Double(12.95)}; 

    Object[] obj2 = new Object[obj1.length]; 
    for(int i = 0; i < obj1.length; i ++) 
     obj2[i] = obj1[i]; 

    //this change to obj1 does NOT effect obj2. 
    obj1[0] = new Integer(5); 

    System.out.println(Arrays.toString(obj1)); 
    System.out.println(Arrays.toString(obj2)); 
    System.out.println(); 


    //this change to obj1 DOES effect obj2 
    ((StringBuffer) obj1[1]).append('s'); 

    System.out.println(Arrays.toString(obj1)); 
    System.out.println(Arrays.toString(obj2)); 

同じ要素を指している配列の両方が、要素が最初case.Canに誰かがなぜそれがここで最初のケースでは第二の配列を変更しない私に説明していない第二の場合における第二の配列を変更する変更。

答えて

2
obj1[0] = new Integer(5); 

ここでは、アレイの1つの最初のインデックスので、他の配列が別のオブジェクトを参照し続けると、影響を受けないの最初のインデックスに新しいオブジェクトへの参照を割り当てます。ここで

((StringBuffer) obj1[1]).append('s'); 

あなたはobj2[1]が参照する同じオブジェクトであるobj1[1]によって参照されるオブジェクトの状態を変更しています。したがって、両方の配列が影響を受けます。

1

この最初のケースでは、同じオブジェクトを変更しています(appendメソッドを呼び出すことによって)。 2番目の方法では、参照を別の参照に置き換えます。元の配列は依然として元の参照を指しているため、変更されません。

1

ここ

obj1[0] = new Integer(5); 

あなたがOBJ1の最初の要素が参照するオブジェクトを変更します。
参照によって参照されるオブジェクトを変更しても、このオブジェクトを参照した他の参照に変更は適用されません。 これで、2つの配列の最初の要素は、同じオブジェクトをもう参照しません。ここ

((StringBuffer) obj1[1]).append('s'); 

常に同じオブジェクト二つの配列参照の最初の要素。 参照しているオブジェクトの内容を変更しました。したがって、このオブジェクトのすべての参照は変更を参照します。