繁体   English   中英

检查变量是否在字符串常量池中

[英]Check if a variable is in the string constant pool

在Java中,当我们在创建字符串对象时使用文字字符串时,我知道在SCP(字符串常量池)中创建了一个新对象。

有没有办法检查变量是在 SCP 中还是在堆中?

首先,正确的术语是“字符串池”,而不是“字符串常量池”; 请参阅字符串池 - 字符串是否始终存在于常量池中?

其次,您没有检查变量。 您正在检查某个变量包含 / 引用的字符串。 (包含对字符串的引用的变量不能“在 SCP”中。该变量要么在堆栈中,要么在堆中(不是 SCP),要么在元空间中。)

有没有办法检查变量是在 SCP 中还是在堆中?

  1. 从 Java 7 及更高版本开始,字符串池位于(正常)堆中。 因此,如果我们从字面上解释它,那么您的问题就没有实际意义。

  2. 在 Java 7 之前,检查String是否在字符串池中的方法是这样做

    if (str == str.intern()) { System.out.println("In the string pool"); }

    但是,这有一个问题,如果池中还没有等效的str ,您就会将str的副本添加到池中。

  3. 从 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM