2

文字列プールに同じ値を持つ 2 つの文字列を含めることはできますか??

String str = "abc";
String str1 = new String("abc");

   Will the second statement with `new()` operator creates two objects of `string` "abc", one on `heap` and another on `string` pool? 

   Now if i call intern() on str1 ie str1.intern(); as a third statement, will str1 refer to the "abc" from String pool? 

  If yes then what will happen to the object that was created on heap earlier by the new(). Will that object be eligible for garbage collection.?
  If no then what will be the result of str1.intern();?
4

5 に答える 5

7

最初のオブジェクトも 1 つのオブジェクトを作成し、2 番目のオブジェクトも 1 つの文字列オブジェクトのみを作成します。違いは、1 つ目は String プールで作成され、2 つ目はヒープのみで作成されることです。str1.intern();を呼び出す場合 その後、文字列プールに追加されます。

String str1 = "abc";
String str2 = new String("abc");
Stirng str3 = "abc"

ここでは、2 つのオブジェクトが作成されます。最初の行は参照 str1 を持つ 1 つの強力なオブジェクトを作成し、3 行目は参照 str3 を持つ 1 行目で作成された同じオブジェクトを指しますが、newここでキーワードを使用しているため、2 行目では 1 つの新しいオブジェクトが作成されます。それがあなたを助けることを願っています。

この回答も確認してください。良い説明があります。

于 2013-07-31T10:25:36.967 に答える
1

「abc」オブジェクトは、クラスのロード時に作成され、文字列プールに配置されます。2 行目は String(String original) コンストラクターを使用します。ここで、original はプール内の「abc」へのポインターです。これは 2 行目のバイトコードです。

NEW java/lang/String
DUP
LDC "abc"
INVOKESPECIAL java/lang/String.<init>(Ljava/lang/String;)V
ASTORE 2
于 2013-07-31T10:37:07.137 に答える
1

new String("abc")はクラス インスタンス作成式であり、新しいオブジェクトを作成する必要があります。内部でリテラル "abc" と同じ char 配列を共有するかどうかは、String の実装次第です。両方の「abc」参照は、同じインターン文字列を使用します。

于 2013-07-31T10:37:29.793 に答える
0

それは基本的に次のとおりです。

// "abc" is interned by the JVM in the pool
String str="abc"; 
// JVM uses the pooled "abc" to create a new instance
String str1=new String("abc"); 

によって参照される新しいStringオブジェクトが 1 つだけ作成されstr1ます。Stringリテラル"abc"は JVM によってインターンされました。リテラル"abc"は文字列プールに既に存在するため、2 番目のステートメントで JVM はそれを使用する必要があります。

于 2013-07-31T10:26:41.540 に答える