foo()
我听说String Literal Pool是堆的一个区域。 从该语句中,我认为String变量必须具有对实际值的引用。
我尝试使用eclipse调试器检查此变量,但是,除了String s1 = "foo";
本身之外,我看不到任何内容。
"foo"
内部是什么?
它是参考(地址)吗?
我怎么能看到它?
答案 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/