Для чего в Java используется StringBuilder и в чём его преимущества перед конкатенацией строк?

Ответ

StringBuilder — это изменяемый (mutable) класс для эффективного построения и модификации строк, особенно при множественных операциях.

Ключевое преимущество — производительность. Конкатенация строк через + или String.concat() создаёт новые неизменяемые объекты String в куче, что приводит к лишним аллокациям памяти и сборке мусора. StringBuilder работает с изменяемым внутренним массивом символов (char[]).

Сравнение на примере цикла:

// НЕЭФФЕКТИВНО: Создаётся много промежуточных строк
String result = "";
for (int i = 0; i < 1000; i++) {
    result += i; // Каждый раз создаётся новый String!
}

// ЭФФЕКТИВНО: Изменяется один объект StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i);
}
String result = sb.toString();

Основные методы:

  • append() – добавление в конец.
  • insert() – вставка в позицию.
  • delete(), replace() – удаление и замена.
  • reverse() – реверс строки.

Когда использовать:

  • Динамическое построение строк в циклах.
  • Формирование сложных SQL-запросов или JSON/XML.
  • Многократные модификации одной строки.

Важно: StringBuilder не потокобезопасен. Для многопоточных сценариев используйте StringBuffer (синхронизированный, но медленнее).

Ответ 18+ 🔞

Давай разберём эту тему, а то я вижу, тут у народа с мозгами иногда пиздец, а не понимание. Речь про StringBuilder. Это, блядь, не просто какой-то там класс, а твой главный инструмент, когда нужно клепать строки как сумасшедший.

Представь себе такую картину: ты пытаешься собрать огромную фразу в цикле, используя обычный плюсик +. Что происходит? А происходит пиздец, Карл! Каждый раз, когда ты пишешь result += i, Java, эта хитрая жопа, создаёт абсолютно новый объект String, а старый отправляет на свалку истории (в GC). Тысяча итераций — это тысяча новых строк, овердохуища мусора и тормоза, как у танка в болоте.

А теперь смотри, как это делает адекватный человек с StringBuilder:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i); // Просто тычем символы в один массив, как последние уроды, и всё работает!
}
String result = sb.toString(); // И только в конце получаем готовую строку. Один раз. Красота!

Вот в чём, сука, магия! Внутри у него обычный массив символов char[], который он при необходимости расширяет. Никакой лишней возни. Просто, эффективно, по-русски — внаглую.

Чем он ещё умеет хуярить?

  • append() — это его конёк, добавляет что угодно в конец.
  • insert() — воткнуть что-то в середину, если приспичило.
  • delete() и replace() — вырезать или заменить кусок, если накосячил.
  • reverse() — развернуть всё задом наперёд, для красоты, что ли.

Когда его хватать? Да почти всегда, когда строка собирается не за один присест! Циклы, формирование какого-нибудь ебучего SQL-запроса из кучи условий, сборка JSON'а — везде его тащи.

Но есть нюанс, ёпта! StringBuilder — парень резкий и не потокобезопасный. Если с ним будут работать сразу несколько потоков, получится бардак, все начнут друг другу вставлять палки в колёса, и результат будет непредсказуемым. Для таких, с позволения сказать, оргий есть его старший братан StringBuffer — такой же, но в медной каске и с дубинкой (все методы синхронизированы). Он медленнее, зато в драке не подведёт.

Короче, запомни: клеишь строку в цикле — бери StringBuilder и не еби мозг. Всё остальное — извращения для мазохистов.