3

以下はインスタンスメソッドのコードスニペットです

 String x = new StringBuffer().append("a").append("b").append("c").toString()

私は印象を受けています。最初に新しい文字列バッファが作成され、次にaが最後に文字列バッファの最後に追加されます。bとcも同様です。その後、stringbufferはstringに変換されます。したがって、私によると、2つのオブジェクトが作成されます(1つは文字列バッファ用、もう1つは文字列用)。正しい?基本的に、私によると、文字列 "a"、 "b"、"c"の中間オブジェクトは作成されません。これは正しいですか?

編集:-すべての応答に従って、オブジェクトは文字列リテラル "a"、 "b"、 "c"に対して作成されるように見えますが、リンクhttp://docs.oracle.com/javase/1.4でアクセスすると。 2 / docs / api / java / lang / StringBuffer.html#toString()、これは一時的な文字列を作成するべきではありません。「全体として、これにより多くの一時的な文字列が作成されるのを回避できます。」を検索します。このリンクで。1.4.2の場合であることに同意しましたが、基本的には1.6でも同じであることを願っています

はい、上記の代わりに以下を行うと、5つのオブジェクトが作成されます。「a」、「b」、「c」の場合は3つ。1つは文字列バッファ用です。そしてついにstringbufferから変換された文字列のために。「a」、「b」、「c」、最後に文字列「abc」のオブジェクトはプールされすぎて、生涯存在します

String str1="a";
String str2="b";
String str3="c";
String x = new StringBuffer().append(str1).append(str2).append(str3).toString()

上記の理解は正しいですか?

4

3 に答える 3

1

他の回答で指摘されているように、2 つのスニペットは同等です (String オブジェクトの作成に関して)。2 番目のスニペットが次のように記述されている場合は、代わりに異なります。

String str1= new String("a");
...

この場合にのみ、新しい String オブジェクトがインスタンス化されることが保証されます (通常はそうする必要はありません)。こちらもご覧ください

于 2012-07-26T16:26:14.313 に答える
1

文字列「a」、「b」、「c」は、両方のコード スニペットのリテラルです。これらは、コードが実行される前にクラスローダーによって作成されます。これを回避する方法はありません (通常は意味もありません)。

したがって、どちらのコード スニペットも基本的に同じことを行い、どちらも同じ数のオブジェクトを作成します。

また、どちらのスニペットも有効なコードではありません。両方のスニペットの最後のステートメントで行うように、StringBuffer = String を割り当てることはできません。

EDIT:Javaバージョン> 1.4についても尋ねます。Java5 以降では、StringBuffer を StringBuilder に置き換える必要があります (基本的にはまったく同じですが、同期されていないため、パフォーマンスが少し向上します)。

于 2012-07-26T16:28:09.120 に答える