14

以下のコードは、私が期待することをしません。このコードの実行後、すべての文字列は null になります。

String[] currentState = new String[answer.length()];
for(String x : currentState)
{
    x = "_";
}

以下のコードは、私が期待することを行います。currentState のすべての文字列が "_" になりました

String[] currentState = new String[answer.length()];
for (int i = 0; i < currentState.length; i++) {
    currentState[i] = "_";
}

最初のケースが機能しない理由を誰か説明できますか?

4

6 に答える 6

31

設計上、各変数'x'(この場合)はに割り当てられることを意図していません。私はそれがうまくコンパイルされることにさえ驚いています。

String[] currentState = new String[answer.length()]; 
for (String x : currentState) { 
    x = "_"; // x is not a reference to some element of currentState 
}

次のコードは、実際に行っていることを示している可能性があります。これは列挙がどのように機能するかではないことに注意してくださいが、「x」を割り当てることができない理由を例示しています。これは、場所'i'にある要素のコピーです。(編集:要素は参照型であることに注意してください。そのため、その参照のコピーであり、そのコピーへの割り当ては同じメモリ位置、つまり位置'i'の要素を更新しません)

String[] currentState = new String[answer.length()]; 
for (int i = 0; i < answer.length(); i++) { 
    String x = currentState[i];
    x = "_";
}
于 2009-02-26T06:57:56.353 に答える
9

元のコード:

String currentState = new String[answer.length()];

for(String x : currentState) 
{ 
    x = "_"; 
}

書き直されたコード:

String currentState = new String[answer.length()];

for(int i = 0; i < currentState.length; i++) 
{ 
    String x;

    x = currentState[i];
    x = "_"; 
}

コードの書き方:

String currentState = new String[answer.length()];

for(final String x : currentState) 
{ 
    x = "_";   // compiler error
}

エラーのあるコードを書き直しました:

String currentState = new String[answer.length()];

for(int i = 0; i < currentState.length; i++) 
{ 
    final String x;

    x = currentState[i];
    x = "_";   // compiler error
}

このようなことを行うとき、変数を最終的なハイライトにします(これは一般的な初心者の間違いです)。すべての変数(インスタンス、クラス、引数、catchの例外など)を最終的にするようにしてください。本当に変更する必要がある場合にのみ、非最終的にしてください。変数の90%〜95%が最終的なものであることがわかります(初心者は、これを開始すると20%〜50%になります)。

于 2009-02-26T07:05:38.830 に答える
4

xは参照(または参照型の変数)だからです。コードの最初の部分はすべて、参照を新しい値に再ポイントすることです。例えば

String y = "Jim";
String x = y;
y = "Bob";
System.out.println(x); //prints Jim
System.out.println(y); //prints Bob

「Bob」への参照を再割り当てしているという事実は、参照が割り当てられたyものには影響しません。x

于 2009-02-26T06:59:54.117 に答える
-1

配列をリストに変換してから、次のように繰り返すことができます。

String[] currentState = new String[answer.length()];
List<String> list = Arrays.asList(currentState);
for(String string : list) {
   x = "_";     
}
于 2009-02-26T08:35:53.950 に答える