有什么方法可以检查,当前字符串池中有哪些字符串。
我可以以编程方式列出池中存在的所有字符串吗?
或者
任何IDE已经有这种插件?
您无法从 Java 代码访问字符串池,至少在 Java VM 的 HotSpot 实现中无法访问。
Java 中的字符串池是使用字符串实习实现的。根据JLS §3.10.5:
字符串字面量总是引用类的同一个实例
String
。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用方法共享唯一实例String.intern
。
并根据JLS §15.28:
类型的编译时常量表达式
String
始终是“内部的”,以便使用方法共享唯一实例String.intern
。
String.intern
是一种本地方法,正如我们在 OpenJDK中的声明中所见:
public native String intern();
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 可以直接访问字符串池。但是,您可以为此目的自己编写本机方法。