如何检查字符串池内容?

时间:2014-06-05 06:57:27

标签: java string string-pool

有没有办法检查,当前字符串池中有哪些字符串。

我可以通过编程方式列出池中存在的所有字符串吗?

任何IDE都有这种插件吗?

1 个答案:

答案 0 :(得分:16)

您无法从Java代码访问字符串池,至少不能在Java VM的HotSpot实现中访问。

Java中的字符串池是使用string interning实现的。根据{{​​3}}:

  

字符串文字始终引用类String的同一实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实现”以便使用方法String.intern共享唯一实例。

根据JLS §3.10.5

  

类型String的编译时常量表达式始终是“实例化”,以便使用String.intern方法共享唯一实例。

String.intern是一种原生方法,我们可以在JLS §15.28中看到:

public native String intern();

its declaration in OpenJDK调用The native code for this method函数。

JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
    JVMWrapper("JVM_InternString");
    JvmtiVMObjectAllocEventCollector oam;
    if (str == NULL) return NULL;
    oop string = JNIHandles::resolve_non_null(str);
    oop result = StringTable::intern(string, CHECK_NULL);
    return (jstring) JNIHandles::make_local(env, result);
JVM_END

也就是说,字符串实习是使用本机代码实现的,并且没有Java API可以直接访问字符串池。但是,您可以为此目的自己编写本机方法。