Сколько строк будет создано в куче при выполнении команды String a = "Hello "+"World"?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
String конкатенация и куча: "Hello " + "World"
Ответ: 1 строка в куче
При выполнении команды String a = "Hello " + "World"; в куче (heap) будет создана одна строка - результат конкатенации.
Почему именно одна?
Компилятор Java выполняет оптимизацию на этапе компиляции (compile-time string concatenation). Строковые литералы, известные на этапе компиляции, объединяются ещё до выполнения программы.
// Исходный код
String a = "Hello " + "World";
// То, что видит компилятор (после оптимизации)
String a = "HelloWorld";
Компилятор просто подставляет уже готовую строку "HelloWorld" в bytecode.
String pool
Строка "HelloWorld" помещается в String Pool (область в куче для интернирования строк). Если позже в коде встретится другая переменная с той же строкой, она будет указывать на тот же объект:
String a = "Hello " + "World"; // 1 объект в pool
String b = "HelloWorld"; // ссылается на ТОТ ЖЕ объект
String c = "Hello " + "World"; // ссылается на ТОТ ЖЕ объект
a == b; // true
a == c; // true
Отличие от динамической конкатенации
Если переменные неизвестны на этапе компиляции, ситуация другая:
String greeting = "Hello ";
String name = "World";
String a = greeting + name; // 2+ объекта в куче!
Здесь:
- Создаётся объект StringBuilder
- Конкатенация выполняется в runtime
- Результат (новая String) также помещается в heap
- StringBuilder удаляется после использования
Практический совет
Для большого количества конкатенаций лучше использовать StringBuilder:
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
sb.append("World");
String result = sb.toString(); // 1 финальная строка
Вывод: строковые литералы оптимизируются компилятором, поэтому в куче будет создана всего одна строка, которая кэшируется в String Pool.