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