[英]Check if a variable is in the string constant pool
在Java中,当我们在创建字符串对象时使用文字字符串时,我知道在SCP(字符串常量池)中创建了一个新对象。
有没有办法检查变量是在 SCP 中还是在堆中?
首先,正确的术语是“字符串池”,而不是“字符串常量池”; 请参阅字符串池 - 字符串是否始终存在于常量池中?
其次,您没有检查变量。 您正在检查某个变量包含 / 引用的字符串。 (包含对字符串的引用的变量不能“在 SCP”中。该变量要么在堆栈中,要么在堆中(不是 SCP),要么在元空间中。)
有没有办法检查变量是在 SCP 中还是在堆中?
从 Java 7 及更高版本开始,字符串池位于(正常)堆中。 因此,如果我们从字面上解释它,那么您的问题就没有实际意义。
在 Java 7 之前,检查String
是否在字符串池中的方法是这样做
if (str == str.intern()) { System.out.println("In the string pool"); }
但是,这有一个问题,如果池中还没有等效的str
,您就会将str
的副本添加到池中。
从 Java 7 开始,上述测试不再可靠。 str.intern()
不再需要将字符串复制到单独的区域以将其添加到字符串池中。 因此,对实习字符串的引用通常与对原始(非实习)字符串的引用相同。
char[] chars = new char[]{'a', 'b', 'c'}; String str = new String(chars); String interned = str.intern(); System.out.println(str == interned);
事实上, str == str.intern()
只能检测您有一个与字符串文字内容相同的非实习字符串的情况。
或者至少列出 SCP 中的所有字符串实例?
没有办法做到这一点。
正如 JB Nizet 所指出的,问这些问题真的没有什么意义:
intern
的级别,最好利用 Java 9+ 垃圾收集器提供的机会性字符串压缩机制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.