私は IntArray A を持っています。
int[] A={1,2,3};
そしてそれをBにコピーします。
int[] B=A;
今、私はAの要素を変更したいです;
A[1]=B[2];
A は {1,3,3} になり、B は同じ {1,2,3} のままになると思います。
B が [1,3,3] に変更されるのはなぜですか?
配列をコピーしていないため、参照を簡単に操作できます。
これは、配列を作成すると、その変数にメモリの一部が割り当てられることを意味します。
int[] array ----------------> PieceOfMemory
あなたが行ったように配列を「コピー」すると、別の変数に同じメモリ部分を指すように指示するだけです
int[] array ----------------> PieceOfMemory <----------------- int[] secondArray
この場合、「PieceOfMemory」を変更すると、両方の変数を変更していることは明らかです。
配列をコピーしたい場合は、次のようにする必要があります。
int[] firstArray = {1,2,3};
int[] secondArray = new int[3];
secondArray = (int[]) clone(firstArray);
今何が起こるかはこれです:
int[] firstArray ---------------------> firstPieceOfMemory
int[] secondArray --------------------> secondPieceOfMemory
ただし、値はコピーされます。
どちらも個別の配列ではありません。
あなたが書いた
int[] B=A;
同じ配列を指しているからです。
変更すると A が自動的にB
変更されます。
定数にしたい場合B
は、 の名前で新しい配列を作成しますB
。
int[] B = new int[3];
参照渡しと値渡しを混同したように: Javaは「参照渡し」または「値渡し」ですか?
オブジェクトと参照の違いを理解する必要があります。
つまり、データのコピーを作成するのでB=A;
はなく、データへの参照のコピーを作成します。
あなたがするとき
int[] B=A;
B
両方とも同じバッキング配列A
を指しています。ここでは、同じ基になる配列を指す参照のみを示します。B
A
A ----->[1,2,3]
^
B----------|
新しいコピーを作成するには、Arrays#copyOfを使用するか、手動で新しい配列を作成してフィールドを 1 つずつコピーします。
はい B も {1,3,3} に変更されました。これは、A と B が配列が格納されている実際のメモリを参照しているだけであり、両方の配列で同じであるため、両方の配列に同じ値が含まれているためです。
B は新しい配列ではないため、A が参照する配列の別の名前です。