【发布时间】:2015-01-28 09:20:36
【问题描述】:
所以,我意识到我要问的问题与一个被一次又一次殴打致死的话题有关,但是,即使在阅读了我能找到的所有答案和文档之后,我仍然很友善对字符串实习感到困惑。可能是因为我对JVM缺乏了解;也许是由于 Java 7 中引入的更改贬低了许多上述答案和文档。无论哪种方式,我都被卡住了,我希望有人可以帮助我更清楚地理解这个概念......
String a = "text";
String b = new String("text");
在上面的例子中,我知道会创建两个 String 对象。我也知道内存中只有一个包含序列't', 'e', 'x', and 't' 的字符数组。
但是,每个字符串对象实际存储在内存中的哪个位置?
如果我读过的内容我没看错:变量a 的引用对象将存储在常量池中,而b 的引用对象将存储在堆中,对吧?
如果是这样,我对实习生池如何维护实习生字符串感到困惑。它是否跟踪常量池中定义的字符串以及从堆中手动实习(调用.intern())的字符串? JVM 是否创建常量池中定义的字符串对象并将它们加载到实习池中?我很困惑这一切是如何运作的......
再次,很抱歉提出如此令人困惑/愚蠢的问题,只是我对JVM 的结构和内部工作方式比较陌生,其中很多都让我头晕目眩。谢谢!
【问题讨论】:
-
我建议你阅读所有答案here
-
与旧版本相比,Java 7 和 8 中的字符串实习基本没有改变。
标签: java string jvm heap-memory string-interning