6

私はこの質問をされました:

String s = "abc"; // creates one String object and one
          // reference variable
In this simple case, "abc" will go in the pool and s will refer to it.
String s = new String("abc"); // creates two objects,
                 // and one reference variable*

上記の詳細に基づいて、以下のコードのprintlnステートメントの前に作成されたStringオブジェクトと参照変数の数はいくつですか?

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);

私の答えは、このコードフラグメントの結果は春冬春夏です

s1とs2の2つの参照変数があります。「春」、「夏」(失われた)、「春夏」、「秋」(失われた)、「春秋」(失われた)、「春夏春」(失われた)の合計8つのStringオブジェクトが作成されました。 )、 "winter"(失われた)、 "spring winter"(この時点で "spring"は失われます)。

このプロセスで失われるのは、8つのStringオブジェクトのうち2つだけです。

それが正しいか?

4

4 に答える 4

4

答えは次のとおりです。2つの参照と8つのオブジェクト。

String s1 = "spring "; //One reference and 1 object in string pool. (if it didn't exist already)

String s2 = s1 + "summer "; //Two references and 3 objects

s1.concat("fall "); //Two references and 5 objects

s2.concat(s1); //Two references and 6 objects

s1 += "winter "; //Two references and 8 objects

System.out.println(s1 + " " + s2);

今あなたの質問:Javaはメモリ内の文字列オブジェクトをどのように処理しますか?

Javaには、クラスのオブジェクトを作成する2つの方法がありますString

  1. 文字列str1="OneString";

この場合、JVMは文字列プールを検索して、同等の文字列がすでに存在するかどうかを確認します。はいの場合、同じへの参照を返します。そうでない場合は、それを文字列プールに追加し、参照を返します。したがって、新しいオブジェクトが作成される場合と作成されない場合があります。

  1. 文字列str1=new String( "OneString");

ここで、JVMはヒープ上にオブジェクトを作成する必要があります。新しいため。OneString文字列プールにすでに存在するかどうかは関係ありません。

プールに文字列を配置することもできます。

Stringオブジェクトでintern()を呼び出すことができます。これにより、Stringオブジェクトがまだプールにない場合はプールに入れられ、プールされた文字列への参照が返されます。(すでにプールにある場合は、すでにそこにあるオブジェクトへの参照を返すだけです)。

次のリンクをご覧ください。

Java文字列プールとは何ですか? "s"は新しいString( "s")とどのように異なりますか?

Javaの文字列プールに関する質問

于 2012-01-25T07:25:22.190 に答える
1

正しく見えます。これはSCJP試験問題です。

concatは新しい文字列を返します。これは失われます。最初のs1は「春冬」で上書きされます

Javaの文字列について知っておくべき2つのこと:

  • 文字列は不変です(すでに説明したように)
  • 文字列は文字列プールに存在する場合があります。「Summer」を作成するたびに、完全に新しい文字列が作成されるわけではありません。不変の「Summer」がプールから出てくる可能性があります(JVMによって異なりますが、Oracleの場合はそうです)。参照:http ://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern ()

乾杯クリスチャン

于 2012-01-25T06:42:55.430 に答える
1

Javaの文字列は不変です。割り当てられた文字配列と、オフセットや長さなどの周囲の情報があります。文字列リテラルを使用して文字列を初期化する場合、コンパイラは最適化を試み、リテラルごとに1つの文字列オブジェクトのみを作成します。これは不変であるため可能です。

文字列に対して連結または+を実行すると、新しい文字列が割り当てられ、データが一緒にコンパイルされます(パフォーマンスが低下します)。

これとは対照的に、文字列からサブ文字列を作成することは事実上無料です-データはコピーされません

于 2012-01-25T06:44:18.503 に答える
1
String s = "abc"; // creates one String object and one 
                 // reference variable 

オブジェクトが文字列定数プールにまだ存在しない場合にのみ、1つの文字列オブジェクトを作成します。

String s = new String("abc"); // creates two objects,
                              // and one reference variable*  

これにより、実際にはヒープ内に1つのオブジェクトのみが作成されます。このStringオブジェクトでintern()メソッドが呼び出された場合にのみ、このオブジェクトをプールに追加します。

String s1 = "spring "; 
String s2 = s1 + "summer ";        
s1.concat("fall ");        
s2.concat(s1);        
s1 += "winter ";
System.out.println(s1 + " " + s2);   

System.out.println()にもう1つの文字列があることを除いて、説明は問題ないようです。:-)
(失われた)と言うとき、それは実際にはそれがライブオブジェクトではないことを意味します(参照はスタックに存在しません)。

于 2012-01-25T07:26:48.450 に答える