12

このWhen should we use intern method of String on String constants で説明されているように、String リテラルは自動的にプールされますが、new を使用して構築されたオブジェクトはプールされないため、その intern メソッドが使用されます。しかし、intern メソッドを使用しても新しいオブジェクトが作成される場合、intern メソッドの使用は何ですか?

String s = "Example";

String s1 = new String("Example"); // will create new object

String s2 = new String("Example").intern(); // this will create new object
 // but as we are calling intern we will get reference of pooled string "Example"

System.out.println(s == s1); // will return false
System.out.println(s == s2); // will return true
System.out.println(s1 == s2); // will return false

では、インターン メソッドの用途は何ですか?

編集

私はインターン メソッドの働きを理解しましたが、私の質問はなぜインターン メソッドがあるのですか? intern メソッドを呼び出すには、new を使用して文字列オブジェクトを作成する必要があるため、文字列の新しいインスタンスが作成されます。

String s3 = new String("Example"); // again new object

String s4 = s3.intern();

System.out.println(s3 == s4); // will return false

そのため、intern メソッドを呼び出しても、s3 がプールされた文字列を指すことはありません。intern メソッドは、プールされた文字列への参照を返します。

また、インターンを呼び出すと、まだプールされていない場合、文字列がプールにプッシュされますか? つまり、任意の文字列でインターンを呼び出すたびに、プールにプッシュされるということですか?

4

3 に答える 3

12

の基本的なアルゴリズム.intern()は次のとおりです。

  1. 文字列のハッシュ セットを作成する
  2. 扱っている文字列がすでにセットに含まれているかどうかを確認します
  3. もしそうなら、セットから1つを返します
  4. それ以外の場合は、この文字列をセットに追加して返します

したがって、基本的に、指定された文字列が存在する場合はプールに存在することを検出するために使用され、それ以外の場合は新しい文字列の新しいインスタンスを作成します。

于 2013-10-15T05:17:55.967 に答える
1

イベントのシーケンスは次のとおりです。

String s = "Example";

プールに Sting リテラルを作成する

String s1 = new String("Example");

// will create new object <-- Correct, just create a new object

String s2 = new String("Example").intern();///

プールに文字列リテラル 'Example' が見つからない場合にのみ、オブジェクトを作成します。この場合、s1 が返されます。

ここで、intern がプールから String を使用するオプションを実際に提供していることがわかれば幸いです。さらにJavaでは、すべての文字列はオブジェクトのみです。したがって、プールは実際には正確な文字シーケンスを持つ文字列の参照です。

stackoverflow 自体に関する非常に優れたスレッドを覚えています。ちょうどあなたのためにそれを見つけました..これをチェックしてください、それは素晴らしいです文字列リテラルプールは文字列オブジェクトへの参照のコレクション、またはオブジェクトのコレクションです

于 2013-10-15T05:13:42.257 に答える
0

このメソッドは、文字列オブジェクトの正規表現を返します。したがって、任意の 2 つの文字列 a と t は、s.intern()==t.intern()であるtrue場合にのみ、でs.equal (t)あるということになりtrueます。

これがあなたの構文です:--

public String intern ()
于 2013-10-15T05:43:55.737 に答える