は不変オブジェクトであるためString
、その内容を変更することはできません。不変とは、 のコンテンツString
が設定されると、それを変更できないことを意味します。参照はいつでも変更できますが、コンテンツ自体は変更できません。
そうは言っても、String
オブジェクトはこの原則に違反する方法を提供していません。いいえsetCharAt
、の結果に新しい値を割り当てることはできませんcharAt(i)
。String
(のような)を変更するように「見える」一部のメソッドが、replace
代わりに、変更された新しいクローン オブジェクトを返すことに注意してください。例えば:
String sample = "Hello World!";
sample.replace('e', '*');
System.out.println(sample);
上記のコードはに変更を加えていないsample
ため、画面に表示される結果は になりますHello World!
。replace
メソッドによって行われた変更をキャプチャするには、sample
変数を の結果に再割り当てする必要がありreplace
ます。
String sample = "Hello World!";
sample = sample.replace('e', '*');
System.out.println(sample);
この場合、によって返されsample
た新しいクローンで変数を更新しています。この値は変更されるため、出力されます。String
replace
H*llo World!
s の内容を変更できない理由がわかったので、String
どのような解決策があるか見てみましょう。
何よりもまず、プログラムの正確な動作を維持するための完璧な方法は、StringBuilder
前に指摘された @MadProgrammer のようなものを使用することです。クラスを見る単純すぎる方法は、StringBuilder
基本的には変更可能なものString
です。それを使用すると、あらゆる種類の交換と変更を行うことができます。
もう 1 つの解決策 (お勧めしません) は、String
を使用して、キャラクターを変更するたびに新しいコピーを作成することです。これは非常に面倒であり、StringBuilder
ソリューションに勝るメリットがないため、詳細については説明しません。
3 番目のソリューションは、要件と柔軟性に応じて異なります。内の特定の文字をすべて置き換えるだけでよい場合は、コードを大幅に簡素化して、前に説明した方法をString
使用できます。replace
次のようになります。
String theWord = "これがテスト文字列です"; char 文字 = 'e'; char changeTo = '*'; 文字列 displayWord = theWord.replace(文字、変更先); System.out.println("結果の単語: " + displayWord);
これにより、次の結果が出力されます。
The resulting word is: H*r* is our t*sting string
繰り返しますが、これは要件が十分に柔軟で、サンプル コードで従う「段階的な」アプローチをスキップできる場合にのみ機能します。