7

是否有任何方法或技术可以知道给定String s已经在字符串池中?如何以及何时Java String创建池?它包含什么初始成员?

4

3 回答 3

4

这个问题没有好的答案。

使用的字符串池String.intern基于弱映射,用户代码无法在该映射上同步,因此您得到的任何答案都可能在您使用之前无效。

甚至字符串文字也可能从实习生池中消失。 类卸载可能导致字符串文字变得无法访问,并且由于类加载依赖于 GC,它是不可预测的。

重申一下,除了整体内存占用外,分析实习生池几乎没有什么有用的信息,而 JVM 往往有更好的方法来通过它们的日志记录和调试钩子来实现这一点。

于 2013-04-30T18:52:44.670 回答
4

我的回答是:没有通用的解决方案。你可以做的是:

boolean wasAlreadyInterned = str.intern() == str;

但这有副作用,现在它肯定会被拘留。

JavaDocString#intern说,String 类私下维护了一个字符串池,最初是空的。

如果您查看该类的实现,String您所看到的只是

public native String intern();

Java 语言规范,第3.10.5 章,字符串文字说:

字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用String.intern.

于 2013-04-30T18:55:40.020 回答
-1

我认为你必须看看Pulling Strings from pool

于 2013-04-30T18:42:37.533 回答