0

Java で String オブジェクトを作成し、それを介して別のものを連結する場合

someString.concat("I am being concatenated to someString");

文字列は不変であるため、結果の文字列を含む一時オブジェクトが作成されますよね?通常、これが完了すると、新しい String オブジェクトがすぐに作成され、それが含まれます。

String newString = oldString.concat("I am being concatenated");

しかし、そうではないと仮定します。その場合、連結された文字列にアクセスする別の方法はありますか? (この最後のケースでは、oldString と "I am being concatenated" の合計です。)

4

4 に答える 4

3

ヒープスペースに新しいオブジェクトを作成しますが、それへの参照がないため、いいえと言います。したがって、ガベージコレクションされます。Java では、ヒープスペースアドレスに直接アクセスする方法はありません ...

于 2012-09-26T07:14:53.537 に答える
2

concat確かに新しいStringオブジェクトを作成します(一時的な意味がわかりません)。その新しいオブジェクトの参照をString変数に保存しないと、後でアクセスする方法がありません。

実際には:

someString.concat("I am being concatenated to someString");

おそらく、ある段階でデッドコードとして排除されるでしょう(コードがJITコンパイラによってコンパイルされるとき/場合)。

于 2012-09-26T07:12:16.443 に答える
1

正しい回答については受け入れられた回答を参照してください。ただし、クレイジーな回答は...

someString.concat("I am being concatenated to someString").intern();
// later on later on in the code...
String s = new String("I am being concatenated to someString").intern();
于 2012-09-26T07:24:53.110 に答える
0

Java の非プリミティブ型の変数は参照であり、オブジェクト自体ではありません (C++ の場合と同様)。次のような行で:

String newString = oldString.concat("I am being concatenated");

想像上の一時文字列の内容がコピーされた新しいオブジェクトは作成されません。String実際、newString一時オブジェクトと思われるものを参照します。(実際には一時オブジェクトはありません)。

于 2012-09-26T07:12:45.067 に答える