28

有什么方法可以检查,当前字符串池中有哪些字符串。

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

或者

任何IDE已经有这种插件?

4

1 回答 1

19

您无法从 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_InternString函数。

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 可以直接访问字符串池。但是,您可以为此目的自己编写本机方法。

于 2014-06-05T10:35:21.130 回答