如何检查字符串池内容?
2022-09-01 14:44:35
有没有办法检查,当前字符串池中存在哪些字符串。
是否可以以编程方式列出池中存在的所有字符串?
或
任何IDE已经有这种插件?
有没有办法检查,当前字符串池中存在哪些字符串。
是否可以以编程方式列出池中存在的所有字符串?
或
任何IDE已经有这种插件?
您无法从 Java 代码访问字符串池,至少在 Java VM 的 HotSpot 实现中无法访问。
Java 中的字符串池是使用字符串间歇实现的。根据 JLS §3.10.5:
字符串文本始终引用类 的相同实例。这是因为字符串文本 (或者更一般地说,作为常量表达式的值的字符串 (§15.28) ) 被“暂存”,以便使用该方法共享唯一实例。
String
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 可以直接访问字符串池。但是,您可以自己编写一个本机方法来实现此目的。