В чем разница между методом append и оператором конкатенации (+) для строк в Java?

Ответ

Разница заключается в производительности и мутабельности (изменяемости).

  • Конкатенация (+): Создает новый объект String при каждой операции, так как строки в Java неизменяемы (immutable).
  • Метод append(): Изменяет существующий объект StringBuilder или StringBuffer (которые являются mutable), не создавая новых объектов строк.

Наглядный пример в памяти:

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

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

Сравнение:

Аспект Конкатенация (+) append() (StringBuilder/Buffer)
Изменяемость Неизменяемые строки (String) Изменяемый буфер (StringBuilder)
Производительность Низкая при множественных операциях (много объектов, сборка мусора) Высокая (минимум объектов)
Потокобезопасность Да (строки immutable) StringBuffer — да, StringBuilder — нет
Использование Простые, однократные операции Многократные операции (циклы, построение сложных строк)

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

Ответ 18+ 🔞

Да ты посмотри, какая разница-то, блядь, интересная! Всё упирается в производительность и в то, можно ли эту штуку менять.

  • Конкатенация (+): Это как строить дом из кубиков, а потом, чтобы добавить один кубик, разъебывать весь дом и строить заново, блядь. Каждый раз создаётся новый объект String, потому что строки в Java — неизменяемые, ёпта.
  • Метод append(): А это уже как пластилин, сука. Взял один комок StringBuilder, и лепишь в него что хочешь, не создавая каждый раз новую хуйню.

Смотри, как в памяти это выглядит, на примере:

// Конкатенация: ПИЗДЕЦ КАК НЕЭФФЕКТИВНО в цикле
String result = "";
for (int i = 0; i < 1000; i++) {
    result = result + i; // На каждом, блядь, витке цикла — новая строка!
}
// Итого в памяти — овердохуища (~1000) временных объектов String, которые потом мусорщик убирает.

// Append: А вот это уже дело, эффективно!
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i); // Всё лепится в один и тот же пластилиновый комок
}
String result = sb.toString(); // И только в конце лепим из него готовую фигурку-строку
// В памяти — в основном один объект StringBuilder, красота!

Короче, сводная таблица, чтобы не ебать мозг:

На что смотрим Конкатенация (+) append() (StringBuilder/Buffer)
Меняемость Неизменяемые, как святой (String) Меняемый буфер, как пластилин (StringBuilder)
Скорость Низкая, если операций много (объектов дохуя, мусорщик пашет) Высокая, объектов минимум
Потокобезопасность Да, потому что неизменяемый StringBuffer — да, StringBuilder — нет, только для одного потока
Когда юзать Для разовой простой операции, сложил два слова и пошёл Для многократного изменения, особенно в циклах — это святое!

Вывод, блядь, простой: Если ты в цикле строку собираешь — ты либо идиот, либо используешь StringBuilder (или StringBuffer, если потоки ебутся). А + оставь для мелочёвки в одну строчку. Всё, вопрос закрыт, в рот меня чих-пых!