2013-09-27 2 views
16

独自のプログラム内で文字列定数プールの内容にアクセスする方法はありますか?Java Stringのインターン(定数)プールにアクセスするか、または照会できますか?

は、私がこれを行い、いくつかの基本的なコードを持って言う:

String str1 = "foo"; 
String str2 = "bar"; 

私たちの文字列定数プールに浮かん2つの文字列が存在することになります。プールにアクセスして上記の値を出力する方法や、プールに現在含まれている要素の現在の合計数を取得する方法はありますか?

すなわち

StringConstantPool pool = new StringConstantPool(); 
System.out.println(pool.getSize()); // etc 
+6

があるであろう多くの、より多くの文字列定数プールには、JDKクラスから来たものとあなたの依存関係。文字列プールは、**クラスローディング**時刻に入力され、文字列定数を参照する実際のコードが実行されるときではないことに注意してください。 –

+0

@MarkoTopolnik興味深い点は、JDKクラスで定義された文字列がプールにロードされているとは考えていませんでした。 – CODEBLACK

+0

クラス自体がロードされると、JDKクラスを含むどのクラスでも該当します。 – EJP

答えて

9

あなたは直接String intern poolにアクセスすることはできません。 String intern poolJavadocs 1として

である:

最初に空の文字列のプールは、 クラス列で個人を維持されます。

ただし、Stringオブジェクトのintern()メソッドを使用して、このプールにStringオブジェクトを追加できます。

java.lang.String.intern()は、グローバル文字列プールにエントリを持つ、interned文字列を返します。 StringがグローバルStringプールにまだ存在しない場合は、追加されます。あなたがこのアプローチに従うことができるプログラム

  1. 宣言をSet<String> StringConstantPool = new HashSet<String>();
  2. コールString.intern()の追加は、このプールにString値を返さ
  3. StringConstantPool
+1

Javadocは間違っていて、実際にこの点で永遠に自己矛盾しています。それは、すべての文字列リテラルと定数値の文字列表現が抑留されている 'は*プールは「最初は空」であることと*の両方trueにすることはできません、Stringクラスには、後者のために責任があるということも真実ではありません。実際には、インターンシップとしてそれを記述するのは間違っています。 – EJP

+2

「最初は空です」と書いておくと、JVMがこのプールをロードするときに空であると言うことになります。 – anubhava

+3

それはビューのOOP点からプライベートだけではなく、実際に(http://stackoverflow.com/questions/3323608/how-is-javas-stringintern-method-implemented)ネイティブメソッドとして実装します]。つまり、リフレクションでもアクセスすることはできません。 –

関連する問題