String c = "a" + "b";Что важно:
Строка в Java хранится как
byte[] + флаг кодировки:0 — LATIN1 (1 байт на символ, для ASCII экономия памяти)1 — UTF-16 (2 байта на символ)Строки размещаются в двух областях:
- куча
- пул строковых констант (SCP)
Пример:
String a = "hello", b = "hello";
a == b → true, обе переменные указывают на один объект из пулаПример:
String a = "hello", b = new String("hello");a == b → false, разные объекты в кучеПри такой записи:
String c = "a" + "b";
компилятор Java выполняет константную свёртку и подставляет готовое значение:
String c = "ab";
Конкатенации на этапе выполнения нет — это вычисляется на этапе компиляции.
но это не работает со строковыми переменными:
java id="xq7v2m"
String a = "a", b = "b", c = a + b;
здесь компилятор Java уже не может сделать константную свёртку, поэтому генерируется вызов через
invokedynamic с StringConcatFactoryНа уровне байткода это реализуется через механизм динамической конкатенации строк (JEP 280 / JEP 357), который выбирает оптимальную стратегию выполнения во время запуска.
В ранних версиях вместо этого использовался
StringBuilder, где код фактически превращался в цепочку append() и финальный toString().👉 Java Portal


