Я действительно смущен тем, как string interning работает на 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.