有没有办法检查,当前字符串池中有哪些字符串。
我可以通过编程方式列出池中存在的所有字符串吗?
或
任何IDE都有这种插件吗?
答案 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可以直接访问字符串池。但是,您可以为此目的自己编写本机方法。