0

私のコードは次のとおりです。

String str = "Hello";
String str1;
str1 = str;
str1 = str1 + " World";
System.out.println(str1);
System.out.println(str);

私が得る出力は次のとおりです。

Hello World
Hello

Hello Worldの理解によれば、str1 = str両方のオブジェクトが同じ場所を参照しているため、1 つのオブジェクトのコンテンツを変更すると、他のオブジェクトも影響を受けるはずです。

では、str1 = str1 + " World";別のメモリ位置に新しい文字列オブジェクトを作成していますか?

4

7 に答える 7

7

文字列は不変です。を行うstr1 = str1 + " World";と、まったく新しい文字列が作成str1され、それへの参照が更新されます。再割り当てすることは決してないstrので、これは予想される動作です。

于 2012-09-28T07:55:35.530 に答える
4

重要なのは、+演算子が新しいStringオブジェクトを作成し、オペランドを効果的に連結することです。オブジェクトは変更されませんstr

http://javarevisited.blogspot.co.at/2010/10/why-string-is-immutable-in-java.htmlを読むとよいでしょう。これは、不変の文字列の概念を非常にうまく説明しています。

このクラスStringBufferは、カスケードされた長い連結用に最適化されていることにも注目する価値があります。

于 2012-09-28T07:56:15.420 に答える
3

java.lang.Stringは不変です

str1 = str1 + " World";

このコードは、str1が新しく作成されたStringオブジェクト"Hello World"を参照し、strが引き続き"Hello"オブジェクトを参照するようにします。

于 2012-09-28T07:57:30.860 に答える
3

Java では String は不変です。

str1 = str1 + " World";新しいインスタンスを作成し、str1 に割り当てます。

于 2012-09-28T07:55:12.273 に答える
2

プリミティブ日付型を参照すると、常に新しいオブジェクトが作成されます

于 2012-09-28T07:58:21.253 に答える
1

いいえ、これは文字列を初期化したコードのように正しい出力です

String str = "Hello";
 String str1;

それからあなたは言う

str1 = str;

str1「こんにちは」が含まれていることを意味します

str1 = str1 + " World";

上記の行にはstr1、「Hello」と「World」が新しい文字列として指定されているため、「HelloWorld」が出力されます。

印刷strすると「こんにちは」という言葉が含まれています

System.out.println(str);
于 2012-09-28T07:57:41.457 に答える
0

ここでの String の特別な点は、すべてに共通の動作です。代入演算子についてです(4行目で再度代入しています)。あなたのコードは以下のようになります。

Person p1 = new Person("Stack");
Person p2;
p2 = p1;
p1 = new Person("OverFlow");

これは何を印刷しますか? どちらも「オーバーフロー」を出力しますか?

あなたの言葉から。

str1 = str後の私の理解によると、両方のオブジェクトが同じ場所を参照しているため、1 つのオブジェクトのコンテンツを変更すると、他のオブジェクトも影響を受けるはずです。

Line 3: str1 = str;

行番号3に従って、あなたは正しいです。

Line 4: str1 = str1 + " World";

しかし、4 行目ではコンテンツを変更していません。str1 を別のオブジェクトに再割り当てしています。

ここで、str、str1、および p1 はオブジェクト参照です。実際のオブジェクトではありません。オブジェクトを変更している場合、同じコンテンツが得られます。お気に入り

p1 = p1.setName("オーバーフロー");

于 2012-09-28T08:36:06.450 に答える