2013-09-27 49 views
16

有沒有辦法在我們自己的程序中訪問字符串常量池的內容?我們可以訪問或查詢Java String intern(常量)池嗎?

說我有做這個工作的一些基本代碼:

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

現在有2串漂浮在我們的字符串常量池。有沒有辦法訪問池並打印出上述值或獲取當前包含在池中的當前總元素數?

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

會有很多很多的字符串在常量池中---來自JDK類和你的任何類依賴。請注意,字符串池在** class loading **時間填充,而不是在引用字符串常量的實際代碼運行時填充。 –

+0

@MarkoTopolnik有趣的一點,我不會假設在JDK類中定義的字符串已經加載到池中。 – CODEBLACK

+0

對於任何類,包括JDK類,一旦類本身已被加載,這是正確的。 – EJP

回答

9

你不能直接訪問String intern pool

作爲每JavadocsString intern pool是:

字符串,初始爲空的池,由 類字符串保持私下

但是可以使用String的intern()方法將String對象添加到此池中。

java.lang.String.intern()返回一個interned字符串,即一個在全局字符串池中有條目的字符串。如果該字符串不在全局字符串池中,那麼它將被添加。

編程你可以按照這個方法:

  1. 聲明Set<String> StringConstantPool = new HashSet<String>();
  2. 呼叫String.intern()
  3. 添加返回String值這個池子StringConstantPool
+1

Javadoc在這一點上一直是錯誤的,並且自相矛盾。它不可能是真的,既池是'最初是空的'*和*'所有字符串文字和常量值字符串表達式interned',並且這也是不正確的是,String類負責後者。把這個描述成實習實際上是錯誤的。 – EJP

+2

我相信通過寫'最初空'他們的意思是說,當JVM加載這個池是空的。 – anubhava

+3

它不僅從OOP的角度來看是私有的,而且實際上是作爲本地方法實現的(http://stackoverflow.com/questions/3323608/how-is-javas-stringintern-method-implemented)。這意味着即使進行反思也無法訪問它。 –

相關問題