如何检查字符串池内容?

Nin*_*ale 25 java string string-pool

有没有办法检查,目前字符串池中有哪些字符串.

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

要么

任何IDE都有这种插件吗?

izs*_*tas 18

您无法从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();
Run Code Online (Sandbox Code Playgroud)

此方法的本机代码调用JVM_InternStringfunction.

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
Run Code Online (Sandbox Code Playgroud)

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

  • @EJP:那一定是*很早*JDK.[我找到了JDK1.2文档](http://www.cs.mun.ca/~michael/java/jdk1.2-docs/api/java/lang/String.html#intern())说:"*所有文字字符串和字符串值常量表达式都被实现.*"我不记得曾经说过不同的Java语言规范.我无法想象另一个不同的`String`池的目的.顺便说一句[你说的那个吗?](http://stackoverflow.com/questions/2431540/garbage-collection-behaviour-for-string-intern#comment2416536_2431597) (3认同)