-1

私は 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] に変更されるのはなぜですか?

4

6 に答える 6

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

ただし、値はコピーされます。

于 2013-09-14T09:16:57.883 に答える
3

どちらも個別の配列ではありません。

あなたが書いた

int[] B=A;

同じ配列を指しているからです。

変更すると A が自動的にB変更されます。

定数にしたい場合B は、 の名前で新しい配列を作成しますB

int[] B = new int[3];

参照渡しと値渡しを混同したように: Javaは「参照渡し」または「値渡し」ですか?

于 2013-09-14T09:11:34.740 に答える
2

オブジェクトと参照の違いを理解する必要があります。

つまり、データのコピーを作成するのでB=A;なく、データへの参照のコピーを作成します。

于 2013-09-14T09:14:13.293 に答える
2

あなたがするとき

int[] B=A;

B両方とも同じバッキング配列Aを指しています。ここでは、同じ基になる配列を指す参照のみを示します。BA

A ----->[1,2,3]
           ^
B----------|

新しいコピーを作成するには、Arrays#copyOfを使用するか、手動で新しい配列を作成してフィールドを 1 つずつコピーします。

于 2013-09-14T09:12:19.657 に答える
1

はい B も {1,3,3} に変更されました。これは、A と B が配列が格納されている実際のメモリを参照しているだけであり、両方の配列で同じであるため、両方の配列に同じ値が含まれているためです。

于 2013-09-14T09:16:13.897 に答える
1

B は新しい配列ではないため、A が参照する配列の別の名前です。

于 2013-09-14T09:12:06.583 に答える