【发布时间】:2015-04-26 14:55:28
【问题描述】:
我真的很困惑string interning 在 Java 中的工作方式。当我写的时候:
String a = "ABC";
String b = "ABC";
if (a==b)
System.out.println("Equal");
编译器是否在编译时将字符串文字“ABC”存储到字符串常量池中?
这听起来不合逻辑,因为我认为字符串常量池是由 JVM 在运行时创建的,我不知道如果它是在编译时完成的,因为 Java 编译器甚至不调用 JVM。
如果不是在编译时完成,而是在运行时完成,那么为什么以下返回 false(取自 this answer)?
// But .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) // --> false
如果是在运行时完成,那么为什么 JVM 不能确定它们是同一个字符串?
对于字符串实习在 Java 中的工作方式以及 Java 字符串池的确切存储位置,我感到非常困惑。
【问题讨论】:
-
我不确定你问题的第一部分,但
substring返回一个 new 对象,因此两个字符串的内容都匹配test,因为它们不是同一个对象==返回 false。 -
这是编译器。我不明白你为什么说它不能同时将字符串放入字符串常量池中。编译器会将常量字符串放在某个内存位置,然后在启动程序时,JVM 会加载该内存并创建常量池以在运行时使用,但该池是由编译器设置的。
-
在 Stack Overflow 推出 6 年多之后,这怎么不是重复的?