反復のジレンマに飛び込む: Foreach ループの代入によって基礎となるデータが変更されない理由
オブジェクト内の要素を直接変更することは直感的に魅力的であるにもかかわらずこの Java に見られるように、foreach ループスニペット:
String boss = "boss"; char[] array = boss.toCharArray(); for(char c : array) { if (c== 'o') c = 'a'; } System.out.println(new String(array)); //Unexpected result: "boss"
このコードは、予想される「低音」ではなく、驚くべきことに「ボス」を生成します。
コピーの公開
の鍵この矛盾を理解するには、反復変数「c」の性質が必要です。一般的な考えに反して、「c」は手元の配列要素の単なるコピーを表します。 "c" の変更は、元の配列の内容には影響しません。
配列変更の謎を解明
配列を真に変更するには、明示的な介入が必要です:
for (int i = 0; i < array.length; i++) { if (array[i] == 'o') { array[i] = 'a'; } }
ここで、コードは実際の配列要素にアクセスして変更し、その結果、必要な要素を反映するように配列が更新されます。
JLS 解釈を理解する
Java 言語仕様 (JLS) は、元のコードを以下と同等のものとして解釈します。
for (int i = 0; i < array.length; i++) { char c = array[i]; if (c == 'o') { c = 'a'; } }
この分解は次のことを強調します。 「c」は配列に影響を与えることができない単なるコピーです。
本質的には、foreachループは、基礎となる構造を妨げることなく、コレクションを反復処理する合理的な手段を提供します。配列を直接変更するには、配列のインデックスと要素を明示的に操作する必要があります。
以上がJava の For-Each ループで文字を変更しても元の配列が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。