【问题标题】:String variable which is initialized with String Literal Pool使用字符串文字池初始化的字符串变量
【发布时间】:2016-02-16 07:25:50
【问题描述】:

String s1 = "foo";

我听说 String Literal Pool 是一个堆的区域。 从那句话中,我认为 String 变量必须具有对实际值的引用。

我尝试使用 Eclipse 调试器检查此变量,但是,除了 "foo" 本身之外,我什么也看不到。

s1 里面是什么?
是参考(地址)吗?
我怎么看出来的?

【问题讨论】:

  • 它是引用的值,就像在任何其他 Object 中一样。
  • 我试图打印出该值,但由于 toString() 已被覆盖,因此失败了。
  • 您不能打印引用的“值”,就像在 C 中打印指针的整数值一样。Java 非常刻意地隐藏了引用存储方式的内部结构。 JVM 可以使用它认为合适的任何值。
  • 它只是对池中字符串对象的引用(地址)。
  • 标准是打印hashcode

标签: java string memory


【解决方案1】:

字符串池被实现为一个固定容量的链式哈希表,每个桶包含一个具有相同哈希码的字符串列表。 它的实现在设计上是对你隐藏的。您可以使用 .intern() 强制 JVM 池化字符串。在 java

【讨论】:

    【解决方案2】:

    字符串 s1 = "foo";

    我听说 String Literal Pool 是一个堆的区域。从此 声明,我认为一个字符串变量必须有一个引用 实际值。

    我尝试使用 Eclipse 调试器检查这个变量,但是,我 除了“foo”本身之外什么都看不到。

    是的,如果您尝试打印 s1 的值,它将显示“foo”本身,因为 toString() 方法被 String 类覆盖,以显示已存储的实际字符串。

    s1 里面是什么? s1 包含对字符串“foo”对象的引用,该对象存在于字符串常量池中。

    是引用(地址)吗?

    是的,它是一个参考(地址)

    我怎么看出来的?

    你看不到引用,因为 Java 对程序员隐藏了它,但另一方面,如果你想将引用点与同一个对象进行比较,你可以使用 hashCode() 方法。只需执行 s1.hashCode() 并打印即可。

    如果您想了解更多关于 Java 字符串管理的信息,请阅读:https://www.talentcookie.com/2016/02/java-string-whats-different/

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 2015-07-22
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      相关资源
      最近更新 更多