在 Java 中,字符串暂存是在编译时完成的吗?
我对字符串实习在Java中的工作方式感到非常困惑。当我写:
String a = "ABC";
String b = "ABC";
if (a==b)
System.out.println("Equal");
编译器是否在编译时将字符串文本“ABC”存储到字符串常量池中?
这听起来不合逻辑,因为我认为字符串常量池是由JVM在运行时创建的,如果它是在编译时完成的,我不明白这怎么可能,因为Java编译器甚至不调用JVM。
如果它不是在编译时完成的,而是在运行时完成的,那么为什么下面的返回 false(取自此答案)?
// But .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) // --> false
如果它是在运行时完成的,那么为什么JVM不能弄清楚它们是相同的字符串?
我对字符串实习在Java中的工作原理以及Java字符串池的确切存储位置感到非常困惑。