2

この下のプログラムについて質問があります

下記のプログラムをご覧ください

public class Kiran {

    public static void main(String args[]) {

        String str = "Test";

        str.replace('T', 'B');

        System.out.println("The modified string is now " + str);
    }

}

私が期待していたのは、このプログラムを実行すると、putput が Best と表示されるはずですが、驚いたことに、出力は Test でした。

誰か教えてください、なぜこのようになっているのですか??

前もって感謝します 。

4

6 に答える 6

13

文字列は Java では不変です。つまり、文字列を変更することはできません。replace メソッドを呼び出すと、実際には新しい文字列が作成されます。

次のことができます。

String str = "Test";
str = str.replace('T', 'B');

これは再割り当てです。

于 2012-06-08T15:01:44.040 に答える
6

String.replace文字列の内容は変更しませんが、置換の結果を返します。代わりに次のことを行う必要があります

str = str.replace('T', 'B');
于 2012-06-08T15:01:52.133 に答える
2

Java の文字列は不変であり、変更することはできません。str.replace のような関数を使用すると、文字列をその場で変更するのではなく、要求した変更を加えた新しい String オブジェクトが返されます。これはString のドキュメントで説明されています:

この文字列内のすべての oldChar を newChar に置き換えた新しい文字列を返します。

今後の参考のために、Java のドキュメントは非常に詳細であり、メソッドが期待する引数、それらが返すもの、およびそれらが持つ副作用 (ある場合) について詳細に説明しています。

于 2012-06-08T15:02:55.957 に答える
2

文字列クラスは不変です。したがって、String オブジェクトに対して行った操作はすべて、新しいString オブジェクトを返します。

replace結果を取得できるように、操作の結果を文字列変数に割り当てる必要があります。

于 2012-06-08T15:02:58.550 に答える
1

Stringオブジェクトは Java では不変です。つまり、オブジェクトを変更するのではStringなく、オブジェクトに対して変更が行われるたびに、新しいStringオブジェクトがメモリ内に作成されます。

メソッドはヒープ メモリにstr.replace('T', 'B')新しいStringオブジェクトを作成しましたが、そのオブジェクトは文字列変数によって参照されていません。そのオブジェクトを参照するには、String変数に割り当てる必要があります。

str = str.replace('T', 'B');
于 2012-06-08T15:30:03.400 に答える
0

上記の回答に加えて、データを大幅に変更(追加/削除)する場合は、StringBuffer(スレッドセーフ)またはStringBuilder(スレッドセーフではない)を使用して、変更が完了したらStringにキャストすることをお勧めします。 。

于 2012-06-08T15:13:52.627 に答える