5

それはおそらく非常に単純なものですが、それでも私を混乱させます!

import java.util.ArrayList;

public class Sample {
    ArrayList<Integer> i = new ArrayList<>();
    ArrayList<Integer> j = new ArrayList<>();

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Sample().go();
    }

    private void go() {

        i.add(1);
        i.add(2);
        i.add(3);

        j=i;

        i.remove(0);


        System.out.println(i + "asd" + j);
    }

}

私はそれを印刷しようとしました:

[2, 3]asd[2, 3]

i が変わると j が変わるのはなぜですか? ただし、プリミティブでは発生しません!

4

6 に答える 6

10

このステートメントは、 と同じ参照になるようにj=i;参照を割り当てます。と の両方が同じオブジェクトを参照するようになりました。0 番目のインデックスの削除は、両方の参照から簡単に確認できます。jiijArrayList

iのアイテムの削除がのリストに影響を与えないようにしたい場合はj、参照を割り当てる代わりに、リストのコピーを作成します。

j = new ArrayList<Integer>(i);

(これは浅いコピーなので、リストは引き続き同じ要素を参照します。)

于 2013-10-24T17:49:45.210 に答える
1

オブジェクトは複製されず、追加のオブジェクト参照が追加されただけです。ArrayList は不変ではないため、オブジェクトへの変更は両方のオブジェクト参照に反映されます。

于 2013-10-24T17:52:01.827 に答える
1

使用する

j = new ArrayList<>(i);

また

Collections.copy(j, i);

コピーを作成します。

あなたは指摘j = iするだけです(それは参照と呼ばれます)。これは、オブジェクト (またはのようなプリミティブ型ではない)を含むすべての割り当てに適用されます。jiintfloat

于 2013-10-24T17:51:06.400 に答える
0

j のメモリ ステージを ; で作成しました。j = 新しい ArrayList<>();
しかし、あなたは j が i の記憶段階を参照すると言いました。したがって、j=i; の後。i または j を変更すると、両方に影響します。同じオブジェクトを参照しているためです。

于 2013-10-24T17:54:36.950 に答える
0

オブジェクトとプリミティブの動作は多少異なります。のようなオブジェクトiは、そのオブジェクトの名前であると考えてください。あなたがJVMに言っていると言うとき、「私が言ったj=i他のものは忘れてください。これから私が言及するとき、私はこれも呼び出される可能性があることを意味します.そして実際、それはまさに起こったことです:その行の後、両方変数は同じオブジェクトを参照します。ArrayListjjArrayListi

プリミティブはあなたが言うように機能します。と言っi=5; j=i; i=6た場合、jそれでも 5 に設定されます。

于 2013-10-24T17:53:16.587 に答える
0

次の方法でこれを行います。

ArrayList<Integer> i = new ArrayList<>();
ArrayList<Integer> j = new ArrayList<>();

// checking hash code before j = i;
System.out.println(System.identityHashCode(i));
System.out.println(System.identityHashCode(j));

j = i;

// checking hash code after j = i;
System.out.println(System.identityHashCode(i));
System.out.println(System.identityHashCode(j));

両方の値が同じである場合は、両方の値を比較します。つまり、 afterj=i; ArrayList jが指しているArrayList i

私のマシンのo/pは次のとおりでした:

30269696 //hashCode of i
24052850 //hashCode of j before j = i;

30269696 //hashCode of i and j are same after j = i that means they are pointing to same reference and hence change in one reflects on the other.
30269696
于 2013-10-24T18:03:48.357 に答える