5

今日は比較的大きなString配列を扱っていました。(サイズはおよそ 400 x 400) 1 つの配列を別の配列と等しくする方法が正確にどのように機能するのか疑問に思っていました。例えば、

String[][] array1 = new String[400][400];
String[][] array2 = array1;

ある配列を別の配列と等しくすることは、各要素をループして別の配列のそれぞれの位置と等しくすることと同じですか? (以下のように)

for(int y = 0; y < 400; y++) {
    for(int x = 0; x < 400; x++) {
        array2[x][y] = array1[x][y];
    }
}

ループ方法は、ある配列を別の配列に等しくすることと同じですか? それとも、最初/秒が他のものより速いですか? array2個人的には、再帰がないか、再帰の前にメモリを手動で割り当てる必要がないという理由だけで、最初の方が高速になると思います。しかし、この情報をどこから探し始めればよいかわかりません。Java がこれらの種類のものをどのように処理するかというロジスティクスを理解したいと思っています。

4

4 に答える 4

12

いいえ、同じではありません。配列は参照オブジェクトであるため、そのコピーではなくarray2、のエイリアスになります。array1の要素に割り当てたものは、array2を通じて「可視」array1になり、その逆も同様です。1 次元配列のコピーを作成したい場合は、そのclone()メソッドを使用できます。コピーが浅いことに注意してください。つまり、配列の個々の要素は複製されません(投稿で説明した2次元配列にはこのトリックは適用できません)。

于 2012-08-13T02:58:32.930 に答える
5

array2 = array1要素のコピーは作成せず、配列参照のみを作成します。したがってarray2array1両方とも同じ基になる配列を参照します。

これは、自分で簡単に判断できます。

String[][] array1 = new String[4][4];
array1[0][0] = "some string";
String[][] array2 = array1;
array1[0][0] = "another string";
System.out.println("array2: " + array2[0][0]);
array2[0][0] = "a third string";
System.out.println("array1: " + array1[0][0]);
于 2012-08-13T02:59:59.863 に答える
1

最初のコード例の 2 行目では、参照 array1 が参照するのと同じ 2 次元配列オブジェクトを参照する String [] 型の参照変数を作成しています。メモリには 1 つの 2 次元配列しかありませんが、array1 と array2 の 2 つの参照変数がそれを参照しています。

あなたは再帰の定義について混乱しているように見えるので、ここで紹介します - Recursion in Computer Science .

于 2012-08-13T03:11:47.713 に答える
1

うーん、ある配列を別の配列と等しくするときは、参照を変更するだけだと思います。例えば:

配列 1 - * [][][][]...[][] * は配列 1 への参照です
配列 2 - & [][][][]...[][] & は配列 2 への参照

次に、配列 1 = 配列 2 配列 1 を設定すると、参照が & に変更され、メモリ参照 & で読み取りが開始されます。

于 2012-08-13T03:01:13.420 に答える