使用String Literal Pool初始化的字符串变量

时间:2016-02-16 07:25:51

标签: java string memory

foo()

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

我尝试使用eclipse调试器检查此变量,但是,除了String s1 = "foo";本身之外,我看不到任何内容。

"foo"内部是什么? 它是参考(地址)吗? 我怎么能看到它?

2 个答案:

答案 0 :(得分:1)

字符串池实现为固定容量链式哈希表,每个桶包含具有相同哈希码的字符串列表。 它的实现在设计上对您隐藏。您可以使用.intern()强制JVM到池字符串。在java< 7字符串池是permgen,如果你不小心可能会导致你的OOM。在7中它被移入堆中,因此OOM的可能性要小得多。

答案 1 :(得分:1)

  

String s1 =“foo”;

     

我听说String Literal Pool是堆的一个区域。从那以后   声明,我以为String变量必须有引用   实际值。

     

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

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

  

s1里面是什么?   s1包含对String“foo”对象的引用,该对象存在于String Constant Pool中。

     

是引用(地址)吗?

是的,它是参考(地址)

  

我怎么能看到它?

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

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