TGViewer
Java: fill the gaps Java: fill the gaps @java_fillthegaps · 12.3K subscribers
Post #318 5.59K
Сложение строк, часть 1: java 8

В JDK есть четыре способа слепить строчки между собой:
🔸 Оператор +
🔸 Класс StringBuilder
🔸 Класс StringBuffer (потокобезопасный StringBuilder)
🔸 Метод concat

В чём проблема с объединением строк?

Класс String - неизменяемый, поэтому при каждом сложении строк создаётся новый объект.
Если это просто "a"+"b", то проблемы нет.

Но в типичном java приложении очень много строчек и их взаимодействий. Больше строк - больше промежуточных объектов. Если не принять специальных мер, то "a"+"b"+"c"+"d" приведёт к созданию ab, abc и abcd.

Строки иногда занимают половину памяти, поэтому оптимизация очень важна.

StringBuilder - специальный класс, который снижает накладные расходы при соединении строк. Выглядит это так:

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
String res = sb.toString();

Что происходит: StringBuilder выделяет байтовый массив и с каждым append добавляет туда строчки. При вызове toString из этого массива создаётся неизменяемая строка. Так количество лишних объектов существенно сокращается.

Единственный минус StringBuilder - плохая читаемость. Половину кода занимает append.

Через + работать приятнее, поэтому у компилятора есть набор оптимизаций при использовании плюсика. Что делает компилятор:

🔸 Соединяет явно обозначенные строки:

String s = "a" + "b" + "c";

Сразу компилируется в abc.

🔸 Сразу соединяет final строки:

final String s1 = "a";
final String s2 = "b";
final String s3 = "с";
String s4 = s1 + s2 + s3;

Это тоже компилируется в abc, без промежуточных объектов.

🔸 Если строки НЕ final, то код выше компилируется в создание объекта StringBuilder, 3 вызова метода append и метод toString

Тут мы подходим к популярному мифу. Помните, вначале я говорила, что "a"+"b"+"c" приводит к созданию объектов ab и abc. Многие понимают это буквально, что это оператор + приводит к созданию лишних объектов. Поэтому лучше плюсик не использовать, а использовать StringBuilder.

Так вот, это неправда. StringBuilder используется под капотом плюсика со времён java 5. А это 2004 год, 17 лет уже прошло.

У такого подхода есть серьёзный недостаток. StringBuilder создаётся даже при сложении двух строк:

String s1 = "b";
String s2 = "с";
String s3 = s1 + s2;

В данном случае это не рационально.

Чтобы склеить две строки без лишних StringBuilder, используйте метод concat:

String s3 = s1.concat(s2);

Итого, как соединить две строки:
🔹 final строчки - через плюсик
🔹 Две строки - через concat
🔹 Несколько строк, но один раз - через плюсик, внутри работает StringBuilder
🔹 Сложные соединения, например, в цикле - явно объявить StringBuilder и использовать его

Ответ на вопрос перед постом

В первом варианте строка-результат соберётся на этапе компиляции, а во втором - во время работы программы. Поэтому первый вариант выполнится быстрее в 20-30 раз.
  • 👍 6
More from @java_fillthegaps
  1. Apr 30, 2026Get Your Hands Dirty on Clean Architecture: отзыв на книгу Когда я подняла тему чистой арх…
  2. Apr 27, 2026​Clean Architecture: отзыв на книгу Наконец-то дочитала книгу Clean Architecture Роберта М…
  3. Mar 4, 2026Как переиспользовать контекст в интеграционных тестах Сегодня расскажу базовый минимум для…
  4. Mar 4, 2026Post #660
  5. Mar 4, 2026Тестовый контекст поднимается 2 минуты. У нас 4 класса с интеграционными тестами, их конфи…
  6. Feb 25, 2026Чистая архитектура. Главы 3-5 Продолжаем спидран по Clean Architecture Роберта Мартина. ⭐️…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →