如何找出给定的String已经在Java String池中了?

时间:2013-04-30 18:34:49

标签: java

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

3 个答案:

答案 0 :(得分:4)

这个问题没有好的答案。

String.intern使用的字符串池基于弱地图,用户代码无法在该地图上同步,因此您获得的任何答案可能无效,然后才能使用它。

甚至字符串文字也可以从实习池中消失。 Class unloading会导致字符串文字无法访问,因为类加载依赖于GC,因此无法预测。

重申一下,除了整体内存占用量之外,分析实习池的信息很少,而JVM往往有更好的方法通过他们的日志记录来实现。调试钩子。

答案 1 :(得分:4)

我的回答是:没有一般解决方案。你能做的是:

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

但这有副作用,现在肯定是实习。

String#intern的JavaDoc说,String类私有地维护一个字符串池,它最初是空的。

如果你看一下班级String的实现,你看到的就是

public native String intern();

Java Language Specification, Chapter 3.10.5, String literals说:

  

字符串文字 - 或者更一般地说,是值的字符串   常量表达式(§15.28) - 被“实习”以便分享唯一的   实例,使用方法String.intern

答案 2 :(得分:-1)

我认为你必须看Pulling Strings from pool