次のコードで作成される文字列オブジェクトはいくつですか?
String s="";
s+=new String("a");
s+="b";
試験でこんな質問がありました。正解が知りたい。私は2つのオブジェクトを言いました。
"" 、 "b" および new String("a"); によって作成されたオブジェクトを含むプールからのオブジェクト。
別のより明確な質問に答えます。次のコード スニペットに含まれる String インスタンスの数は次のとおりです。
String s="";
s+=new String("a");
s+="b";
そして答えは6です。
""
;"a"
。new String("a")
;s
のコピーと連結して作成された文字列"a"
。"b"
s
と を連結して作成された文字列"b"
。3 つの String リテラルが以前に読み込まれたコードによって既に作成されていると仮定すると、コード スニペットは 3 つの新しい String インスタンスを作成します。
文字列s="";
オブジェクトを作成しません。
s + = new String( "a");
5つのオブジェクトを作成します。、new String
StringBuilderとそのchar []、および結果の文字列とそのchar []
s + = "b";
StringBuilderとそのchar[]、および結果のStringとそのchar[]の4つのオブジェクトを作成します。
したがって、合計9つのオブジェクトを取得します。そのうちの3つのStringオブジェクトです。
注:「」は、ClassLoaderやClassを含む多くのシステムクラスに表示されるように、すでにロードされていることを確認できます。
文字列「a」および「b」は、この質問の目的では、新しい文字列と見なされる場合と見なされない場合があります。私見では、それらは最大で1回しか作成されないため、カウントしません。このコードが1回だけ実行される場合、作成される文字列の数はほとんど問題になりません。より有用である可能性が高いのは、コードが実行されるたびに作成されるオブジェクトの数を知ることです。
新しい文字列を作成する
前に、文字列を作成するさまざまな方法の微妙な違いについて詳しく説明することを約束しました。String を作成する方法の例をいくつか見てみましょう。さらに、プールには他の String オブジェクトが存在しないと仮定します。
String s = "abc"; // creates one String object and one reference variable
この単純なケースでは、「abc」がプールに入り、s がそれを参照します。
String s = new String("abc"); // creates two objects, and one reference variable
この場合、
new
キーワードを使用したため、Java は通常の (非プール) メモリに新しい String オブジェクトを作成し、それs
を参照します。さらに、リテラル「abc」がプールに配置されます。
SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065).pdf より
JITC 状況で実際に作成されるオブジェクトの数は不確定です。JITC はnew String("a")
が ID であり、 の中間値s
が参照されていないことを十分に認識できるため、StringBuilder のみが作成されます。一般的な場合 (たとえば、 への引数が無効になる可能性がある場合) で模倣しなければならない潜在的な副作用がいくつかありますnew String()
が、リテラルでは発生しません。
実際、javac は結果が "ab" であり、潜在的な副作用がないことを非常によく認識し、その値の文字列リテラルを生成するだけです。(少し複雑でないケースでは、文字列結合を行います。)