← Назад к вопросам

Как избежать создания нового объекта при сложении строк?

2.0 Middle🔥 111 комментариев
#JVM и управление памятью#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как избежать создания нового объекта при сложении строк

Проблема

Оператор + для строк в Java работает неэффективно. При каждой операции сложения создаётся новый объект String, а старый отправляется на удаление сборщиком мусора. Это приводит к:

  • Излишним аллокациям памяти
  • Фрагментации heap
  • Деградации производительности

Решение 1: StringBuilder (лучший выбор)

Для мутируемого построения строк используй StringBuilder — это основной инструмент:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // Здесь создаётся String один раз

Сравнение производительности:

// ❌ Медленно: создаёт N новых объектов
String result = "";
for (int i = 0; i < 10000; i++) {
    result += "item" + i;
}

// ✅ Быстро: создаёт 1 объект
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append("item").append(i);
}
String result = sb.toString();

Решение 2: StringBuffer (потокобезопасный вариант)

Если строку строишь в многопоточной среде, используй StringBuffer — это синхронизированная версия StringBuilder:

StringBuffer sb = new StringBuffer();
sb.append("thread-safe");

НО: StringBuffer медленнее на 10-15% из-за синхронизации. Используй только если критично.

Решение 3: String.join() для коллекций

Для объединения элементов коллекции используй String.join():

List<String> items = Arrays.asList("a", "b", "c");
String result = String.join("-", items); // a-b-c

Это удобнее и понятнее, чем циклы со StringBuilder.

Решение 4: String.format() когда важна читаемость

Для форматирования с подстановкой переменных:

String name = "Alice";
int age = 30;
String result = String.format("Имя: %s, возраст: %d", name, age);

Как работает оптимизация компилятора

Модерный Java-компилятор частично оптимизирует + операторы. Например:

String result = "Hello" + " " + "World";
// Компилятор может оптимизировать это до одной конкатенации

НО эта оптимизация работает только на compile-time для литеральных строк, а не для переменных.

Рекомендации

  1. В цикле или при большом количестве конкатенаций → StringBuilder
  2. Для быстрой конкатенации 2-3 строк → можно +, но лучше StringBuilder
  3. Для коллекций → String.join()
  4. Для форматирования → String.format() или StringBuilder
  5. В многопоточной среде → StringBuffer (редко нужен)

Метрики и числа

Практический пример показывает: при конкатенации 10000 строк StringBuilder быстрее в 100-200 раз чем оператор +.

Как избежать создания нового объекта при сложении строк? | PrepBro