StringBuffer.append: примеры (JAVA)

Работа с методом append у StringBuffer. Синтаксис и примеры
Раздел: Строки (String) - части строк (StringBuilder, StringBuffer)
StringBuffer.append(String str): StringBuffer

Описание метода StringBuffer.append

Метод append класса StringBuffer предназначен для добавления строкового представления переданного аргумента к текущей последовательности символов. Этот метод применяется при накоплении строк, когда требуется избежать создания множества промежуточных объектов, как при обычной конкатенации через оператор +.

Метод имеет несколько перегруженных версий:

  • append(boolean b) – добавляет строку "true" или "false".
  • append(char c) – добавляет один символ.
  • append(char[] str) – добавляет массив символов целиком.
  • append(char[] str, int offset, int len) – добавляет часть массива, начиная с индекса offset длиной len.
  • append(CharSequence s) – добавляет последовательность символов (например, String, StringBuilder, StringBuffer).
  • append(CharSequence s, int start, int end) – добавляет подпоследовательность от start до end.
  • append(double d), append(float f), append(int i), append(long l) – добавляют строковое представление числа.
  • append(Object obj) – вызывает String.valueOf(obj) и добавляет результат.
  • append(String str) – добавляет строку (если null, добавляется "null").
  • append(StringBuffer sb) – добавлено в Java 1.5, добавляет содержимое другого буфера.

Возвращаемое значение: сам объект StringBuffer (тип StringBuffer). Благодаря этому возможна цепочка вызовов:

sb.append("a").append("b").append(42);

Примеры использования

Пример 1. Добавление целого числа и строки.

StringBuffer sb = new StringBuffer("Число: ");
sb.append(100);
System.out.println(sb);
Число: 100

Пример 2. Добавление массива символов.

char[] arr = {'J', 'a', 'v', 'a'};
StringBuffer sb = new StringBuffer();
sb.append(arr);
System.out.println(sb);
Java

Пример 3. Использование цепочки вызовов.

StringBuffer sb = new StringBuffer();
sb.append("A").append("B").append("C");
System.out.println(sb);
ABC

Пример 4. Добавление null через перегрузку append(String).

StringBuffer sb = new StringBuffer();
sb.append((String) null);
System.out.println(sb);
null

Альтернативы в Java

StringBuilder – аналог StringBuffer, но без синхронизации. Предпочтительнее в однопоточном коде, так как быстрее.

Оператор + для строк – компилятор преобразует его в StringBuilder внутри цикла, но в циклах с большим числом итераций лучше использовать явный StringBuilder.

String.concat – создаёт новый объект строки каждый раз, менее эффективно при многократном добавлении.

String.join – удобен для объединения массива строк с разделителем.

Collectors.joining в потоках – для поточной обработки.

Альтернативы в других языках

PHP: оператор конкатенации .=

$s = 'Привет, ';
$s .= 'мир!';
Привет, мир!

JavaScript: оператор += или метод concat.

let s = 'Привет, ';
s += 'мир!';
Привет, мир!

Python: объединение через += или ''.join().

s = 'Привет, '
s += 'мир!'
Привет, мир!

SQL: функция CONCAT или оператор ||.

SELECT CONCAT('Привет, ', 'мир!');
Привет, мир!

C#: класс StringBuilder с методом Append.

var sb = new StringBuilder();
sb.Append("Привет, ");
sb.Append("мир!");

Lua: функция table.concat для массива строк.

local parts = {"Привет, ", "мир!"}
local s = table.concat(parts)

Go: пакет strings с типом Builder и методом WriteString.

var b strings.Builder
b.WriteString("Привет, ")
b.WriteString("мир!")

Kotlin: StringBuilder с методом append.

val sb = StringBuilder()
sb.append("Привет, ").append("мир!")

Отличие от Java: во многих языках нет синхронизированной версии (как StringBuffer); в PHP и JavaScript строки неизменяемы, поэтому многократная конкатенация может быть менее эффективной.

Типичные ошибки

Ошибка 1. Забывают, что append возвращает this, и пытаются присвоить результат новой переменной, хотя это не обязательно.

StringBuffer sb = new StringBuffer("A");
String result = sb.append("B"); // Ошибка компиляции: incompatible types

Ошибка 2. Использование StringBuffer в однопоточном приложении вместо более быстрого StringBuilder.

Ошибка 3. Предположение, что append(null) вызовет исключение – на самом деле добавляется строка "null".

StringBuffer sb = new StringBuffer();
sb.append((String) null);
System.out.println(sb.length()); // 4, а не исключение
4

Ошибка 4. Неправильное указание индексов в перегрузке с char[] offset/len (выход за границы массива).

Изменения в последних версиях

Метод append класса StringBuffer не претерпел значительных изменений в API начиная с Java 1.0. В Java 5 была добавлена перегрузка append(StringBuffer sb) и append(CharSequence s, int start, int end). Внутренняя реализация могла изменяться для оптимизации (например, компактные строки в Java 9), но сигнатуры и поведение остались прежними. На момент Java 17-21 никаких новых перегрузок не появилось.

Расширенные примеры

Пример 1. Добавление подмассива символов.

Пример java
char[] chars = {'H', 'e', 'l', 'l', 'o'};
StringBuffer sb = new StringBuffer();
sb.append(chars, 1, 3); // начиная с индекса 1, 3 символа: e l l
System.out.println(sb);
ell

Пример 2. Добавление части CharSequence.

Пример java
StringBuffer sb = new StringBuffer();
sb.append("Hello, World", 7, 12); // подстрока "World"
System.out.println(sb);
World

Пример 3. Цепочка с разными типами.

Пример java
StringBuffer sb = new StringBuffer();
sb.append(false).append(' ').append(123.45).append(" " + 100L);
System.out.println(sb);
false 123.45 100

Пример 4. Многопоточное использование (синхронизация StringBuffer).

Пример java
StringBuffer sb = new StringBuffer();
Runnable task = () -> {
    for (int i = 0; i < 1000; i++) {
        sb.append("x");
    }
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start(); t2.start();
t1.join(); t2.join();
System.out.println(sb.length()); // 2000
2000

Пример 5. Сравнение производительности StringBuffer и оператора + в цикле.

Пример java
long start = System.nanoTime();
String s = "";
for (int i = 0; i < 10000; i++) s += "a";
long end = System.nanoTime();
System.out.println("concat time: " + (end - start));

start = System.nanoTime();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10000; i++) sb.append("a");
end = System.nanoTime();
System.out.println("StringBuffer time: " + (end - start));
concat time: ~150000000
StringBuffer time: ~500000

джава StringBuffer.append function comments

En
StringBuffer.append Appends the string representation of the argument to the sequence