StringBuffer.append: примеры (JAVA)
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. Добавление подмассива символов.
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.
StringBuffer sb = new StringBuffer();
sb.append("Hello, World", 7, 12); // подстрока "World"
System.out.println(sb);
World
Пример 3. Цепочка с разными типами.
StringBuffer sb = new StringBuffer();
sb.append(false).append(' ').append(123.45).append(" " + 100L);
System.out.println(sb);
false 123.45 100
Пример 4. Многопоточное использование (синхронизация StringBuffer).
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 и оператора + в цикле.
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