2

次のコードは、この出力を生成します。

aaab -> aabb -> abbb -> bbbb

私の目標は、次のようにすることです。

aaab -> aaba -> abaa -> baaa

しかし、なぜこの結果が得られたのかを理解するのに苦労しています。

    String abcd = 'abcd';
    int l=3;
    byte[] word=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};
    System.out.println(new String(word)); // print: aaaa
    while (l >= 0) {
        byte[] present=word; // !!!
        present[l + 1 - (l - (--l))] = abcd[1];
        System.out.println(new String(present)); // print: aaab -> aabb -> abbb -> bbbb
    }
    System.out.println(new String(word)); // print: bbbb

この行を変更すると(5):byte[] present=word;

byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};

その後、目的の出力が得られます。なぜこうなった?

4

6 に答える 6

7

presentへの参照に設定されていますword。の値はwordコピーされません。したがって、presentの値を変更すると、実際にはpresent「参照」する変数が変更されますword

于 2013-08-02T20:01:01.973 に答える
4
byte[] present=word;

参照をコピーするだけで、present への変更は word に反映されます。つまり、write to present は同じ変更を word に適用します。ディープコピーを作成するには System.arraycopy() を実行する必要があります

于 2013-08-02T20:01:48.617 に答える
4

この行で同じオブジェクトに対して2つの参照を与えていると思います:

byte[] present=word;

単語オブジェクトを複製して他の目的に使用することはありません。

于 2013-08-02T20:02:00.343 に答える
2

配列は参照型の変数だからです。だからあなたがするとき

byte[] present=word

同じオブジェクトへの新しい参照を作成するだけです。もちろん、とにかくオブジェクトを変更すると、すべての参照に反映されます。それでおしまい。

于 2013-08-02T20:01:42.733 に答える
2

「なんで言葉が変わるの?」

変えたから!どこ?ここ:

byte[] present=word;
present[l + 1 - (l - (--l))] = abcd[1];

以前は=を initlaizepresentしていたので、 を参照していwordます。
そして 2 行目は と の両方の値を変更しpresentますword

セカンドバージョンはどこで動作しますか?

byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};

古い配列を参照するのではなく、新しい配列を作成するためです。

于 2013-08-02T20:01:59.070 に答える
0

現在は単語へのポインターであるように思われ、それがそれを変更している理由です。次のようにしてコピーすることもできます。

byte[] present = new byte[word.length];
for (int i=0;i<word.length;i++) {
  present[i] = word[i];
}

私のJavaが悪い場合は申し訳ありません...私は最近Javascriptをログ全体で使用しており、混乱している可能性があります。

于 2013-08-02T20:01:29.937 に答える