-5

このコードがわかりません。なぜ私の文字列はmethod ではc変化せず、 で変化するのですか。説明して頂けますか? mainchangeString

class MainClass {
    public static void main(String[] args) {
        String c = "lalala";
        changeString(c);
        System.out.println("str in main = "+c);
    }

    public static void changeString(String str) {
        str = str + "CHANGE!!!";
        System.out.println("str in changeString = "+str);
    }

}

結果:

str in changeString = lalalaCHANGE!!!
str in main = lalala
4

4 に答える 4

4

はい、Java 文字列は不変です。

ではchangeString、文字列への参照を渡し、その参照を指すものにlalala変更しています。元の文字列オブジェクトは変更されず、参照は引き続き元のオブジェクトを参照します。lalalaCHANGE!!!main

文字列の代わりに StringBuilder を使用し、その StringBuilder に追加CHANGE!!!する場合、メインで表示すると変更が反映されます。

class MainClass {
    public static void main(String[] args) {
        StringBuilder c = new StringBuilder("lalala");
        changeString(c);
        System.out.println("str in main = "+c.toString());
    }

    public static void changeString(StringBuilder str) {
        str.append("CHANGE!!!");
        System.out.println("str in changeString = "+str.toString);
    }

}

この変更されたバージョンでは、次のようになります。

str in changeString = lalalaCHANGE!!!
str in main = lalalaCHANGE!!!
于 2013-09-05T11:22:45.093 に答える
3

Java文字列は不変ですか?

文字列は不変であり、オブジェクト自体を変更することはできませんが、参照はもちろん変更できます。

したがって、changeStringメソッドでこれを行うと:

str = str + "CHANGE!!!";

新しい文字列メモリ オブジェクトが作成されます。ただしc、メソッド内の参照mainはまだ古いスティング メモリ オブジェクトを指しているため、 が出力されlalalaます。

于 2013-09-05T11:22:38.337 に答える
1

もちろん、文字列は不変です。

注: String クラスは不変であるため、一度作成すると String オブジェクトを変更することはできません。String クラスには、文字列を変更するように見えるいくつかのメソッドがあり、そのうちのいくつかについては以下で説明します。文字列は不変であるため、これらのメソッドが実際に行うことは、操作の結果を含む新しい文字列を作成して返すことです。

http://docs.oracle.com/javase/tutorial/java/data/strings.html

str = str + "CHANGE!!!";

このコードは別の文字列を返し、その参照を変数に置き換えていますが、元の文字列は変更されていません。

于 2013-09-05T11:23:39.993 に答える
0

はい、Java文字列は不変です。

文字列は定数です。作成後に値を変更することはできません。

そしてJavaの文字列は非常に特別な扱いをしています

ここでもっと読む:


于 2013-09-05T11:21:21.990 に答える