В чем разница между String и StringBuilder в Java?

Ответ

Stringнеизменяемый (immutable) класс. Любая операция, изменяющая строку (конкатенация, замена), создает новый объект String в памяти.

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

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

// НЕЭФФЕКТИВНО с String: создается несколько объектов
String result = "";
for (int i = 0; i < 100; i++) {
    result += "number" + i + " "; // Каждая итерация создает новый String!
}

// ЭФФЕКТИВНО с StringBuilder: работает с одним объектом
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    sb.append("number").append(i).append(" "); // Модифицирует внутренний буфер
}
String result = sb.toString(); // Создание String только в конце

Ключевые различия:

Характеристика String StringBuilder
Изменяемость Immutable (неизменяемый) Mutable (изменяемый)
Потокобезопасность Да (так как immutable) Нет (не синхронизирован)
Производительность Низкая при частых модификациях Высокая при частых модификациях
Память Может создавать много промежуточных объектов Работает с одним буфером, минимизируя аллокации
Методы concat(), substring(), replace() (возвращают новый объект) append(), insert(), delete() (модифицируют текущий)

Аналоги: StringBuffer — устаревшая, потокобезопасная (синхронизированная) версия StringBuilder. Используйте StringBuilder, если синхронизация не требуется.

Правила выбора:

  • Используйте String: Для константных строк, ключей, когда неизменяемость — это преимущество (безопасность в многопоточности, использование как ключа в HashMap).
  • Используйте StringBuilder: Для динамического построения строк внутри методов (особенно в циклах), когда известно приблизительное количество модификаций. Всегда предпочитайте его конкатенации (+) в циклах.

Ответ 18+ 🔞

Давай разберём эту дичь про строки, а то народ путается, как будто в голове у них не мозги, а сплошной StringBuilder без toString().

Смотри, есть у нас два главных героя: String и StringBuilder. Первый — это как икона в бабушкиной комнате: тронуть нельзя, только смотреть. Он неизменяемый, ёпта. Что бы ты с ним ни делал — конкатенация, замена символов — он тебе каждый раз новый объект в памяти отгрохает. Старый остаётся как есть, просто ты на него больше не ссылаешься, и его со временем сборщик мусора похерит.

А StringBuilder — это уже рабочий инструмент, как разводной ключ. Его можно крутить, вертеть, добавлять в него что угодно, и он всё это впихнет в один и тот же объект. Никаких лишних созданий, всё по-хозяйски, экономно.

Вот тебе наглядный пиздец, который происходит в циклах:

// ЭТО ПИЗДЕЦ. НЕ ДЕЛАЙ ТАК.
String result = "";
for (int i = 0; i < 100; i++) {
    // Каждый раз здесь: создаётся новый String, старый в утиль.
    // Память плачет, процессор рыдает. Производительность — пизда.
    result += "number" + i + " ";
}
// А ЭТО УМНО И ПРАВИЛЬНО.
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    // Всё лепится в один буфер. Быстро, чисто, красиво.
    sb.append("number").append(i).append(" ");
}
// И только в конце превращаем накопленное в итоговую строку.
String result = sb.toString();

Краткая сводка, кто есть кто:

Признак String StringBuilder
Можно менять? Не-а, immutable, святой. Да, mutable, работяга.
Потоки? Потокобезопасен, ибо святой. Нет, не синхронизирован.
Скорость при частых правках Овердохуища тормозов. Быстро, как хуй с горы.
Память Мусорит промежуточными объектами. Аккуратный, один буфер.
Методы concat(), substring() — возвращают новенького. append(), delete() — ковыряют существующего.

Про StringBuffer: Это такой же StringBuilder, но старой закалки, с синхронизацией. Сейчас он как мартышлюшка в зоопарке — вроде есть, но почти никому не нужен. Бери StringBuilder, если не работаешь с потоками напрямую.

Итог, блядь, простой:

  • String — для всего, что не планируется менять. Константы, ключи, сообщения. Его неизменяемость — это фича, а не баг.
  • StringBuilder — когда нужно собрать строку по кусочкам, особенно в цикле. Это твой молоток и гвозди для такой работы. Забудь про конкатенацию (+) в циклах, а то волнение ебать — сожрёт всю память.