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

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

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

StringBuilder.append это метод, который добавляет строковое представление переданного аргумента в конец текущей последовательности символов. Используется для эффективной конкатенации строк, особенно в циклах, поскольку не создает новый объект каждый раз, как это делает конкатенация через '+' для String.

Метод перегружен для различных типов:

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

Возвращает сам объект StringBuilder, что позволяет использовать цепочку вызовов.

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

StringBuilder sb = new StringBuilder("Java");
sb.append(" ").append(8).append(" is great");
System.out.println(sb); // Java 8 is great
Java 8 is great
StringBuilder sb2 = new StringBuilder();
sb2.append(true).append(", ").append(3.14f).append(", ").append('A');
System.out.println(sb2); // true, 3.14, A
true, 3.14, A
char[] chars = {'a','b','c','d'};
StringBuilder sb3 = new StringBuilder();
sb3.append(chars, 1, 2);
System.out.println(sb3); // bc
bc
StringBuilder sb4 = new StringBuilder("Hello ");
sb4.append((CharSequence) "World", 0, 5);
System.out.println(sb4); // Hello World
Hello World
Object obj = null;
StringBuilder sb5 = new StringBuilder();
sb5.append(obj);
System.out.println(sb5); // null
null

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

В Java есть несколько способов объединения строк:

  • StringBuffer аналог StringBuilder, но синхронизирован (потокобезопасен), медленнее. Рекомендуется только при многопоточном доступе.
  • String.concat(String) создает новый объект String, что неэффективно в циклах.
  • Оператор + для строк компилятор преобразует в StringBuilder в последовательных выражениях, но в цикле создает множество объектов.
  • String.format удобен для форматирования, но медленнее и использует внутренний Formatter.
  • String.join (Java 8+) объединение массива строк с разделителем.

Для производительной конкатенации в циклах предпочтительнее StringBuilder.

Аналоги в других языках

Многие языки имеют встроенные средства для сборки строк:

  • PHP: оператор . (точка) для конкатенации, но для больших объемов используют implode или буферы через массив.
  • JavaScript: оператор + или +=, в современных версиях используют шаблонные литералы. Для накопления в цикле собирают массив и затем join('').
  • Python: оператор + (для небольшого количества), для цикла лучше собрать список и ''.join().
  • SQL: оператор || (в SQLite, PostgreSQL) или функция CONCAT() (MySQL).
  • C#: класс StringBuilder с методом Append, почти идентичен Java.
  • Lua: оператор .. для конкатенации, но для циклов используют таблицу и table.concat.
  • Go: пакет strings с типом Builder и методом WriteString.
  • Kotlin: функции buildString { append(...) } и plus.

Примеры:

// JavaScript
let arr = ['a','b','c'];
let str = arr.join(''); // "abc"
"abc"
// Python
parts = ['Hello', 'World']
result = ' '.join(parts)  # 'Hello World'
'Hello World'
// Go
var b strings.Builder
b.WriteString("Hello")
b.WriteString(" World")
s := b.String() // "Hello World"
"Hello World"

Типичные ошибки при использовании StringBuilder.append

  1. Присваивание результата append самому себе метод возвращает тот же объект, поэтому избыточное присваивание не вредно, но может сбивать с толку:
    StringBuilder sb = new StringBuilder("a");
    sb = sb.append("b"); // избыточно, sb.append("b") уже изменяет sb
  2. Использование StringBuilder вместо String в простых конкатенациях для одной-двух строк проще использовать '+' или concat.
  3. Забыть вызвать toString() результат в виде StringBuilder, а не строка.
  4. Передача null append(null) добавляет строку "null". Иногда ожидается NullPointerException или пропуск. Для обработки null следует проверять явно.
  5. Смешивание StringBuilder и StringBuffer без необходимости может привести к ненужным синхронизациям.
  6. Использование append в цикле с большим количеством итераций, когда начальная емкость не задана может привести к частому расширению внутреннего буфера. Рекомендуется задавать capacity.

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

Метод append не претерпел значительных изменений со времен появления StringBuilder в Java 1.5. Однако косвенные изменения:

  • В Java 7 были улучшены алгоритмы работы с char array.
  • В Java 8 появилась поддержка лямбда-выражений, но сам append не изменился.
  • В Java 9 введены компактные строки (compact strings), что повлияло на внутреннее представление, но интерфейс метода остался прежним.
  • В Java 11 добавлен метод isEmpty() для StringBuilder, который можно использовать после append для проверки.
  • Метод append(CharSequence, int, int) был добавлен в Java 1.5 и не менялся.
  • В Java 13-14 появились текстовые блоки (text blocks), но это не влияет на append.

Таким образом, append остается стабильным методом, подходящим для использования во всех современных версиях Java.

Расширенные примеры использования StringBuilder.append

Пример 1: append с подпоследовательностью CharSequence.

Пример java
StringBuilder sb = new StringBuilder("The quick brown fox ");
CharSequence seq = "jumps over the lazy dog";
sb.append(seq, 6, 11); // "over "
System.out.println(sb);
The quick brown fox over 

Пример 2: append с массивом символов с указанием смещения и длины.

Пример java
StringBuilder sb2 = new StringBuilder();
char[] data = {'J','a','v','a',' ','8',' ','i','s',' ','f','u','n'};
sb2.append(data, 0, 4); // "Java"
sb2.append(data, 11, 3); // "fun"
System.out.println(sb2); // "Javafun"
Javafun

Пример 3: Цепочка вызовов после создания StringBuilder с заданной емкостью.

Пример java
StringBuilder sb3 = new StringBuilder(50);
sb3.append("Hello").append(", ").append("World").append("!");
System.out.println(sb3);
System.out.println("Capacity: " + sb3.capacity());
Hello, World!
Capacity: 50

Пример 4: append с объектом, переопределяющим toString.

Пример java
class Point { int x,y; Point(int x,int y){ this.x=x; this.y=y; } public String toString(){ return "("+x+","+y+")"; } }
StringBuilder sb4 = new StringBuilder("Point: ");
sb4.append(new Point(3,4));
System.out.println(sb4); // Point: (3,4)
Point: (3,4)

Пример 5: append и производительность: в цикле лучше использовать один StringBuilder с указанием capacity.

Пример java
int n = 10000;
StringBuilder sb5 = new StringBuilder(n * 5); // предполагаем среднюю длину
for (int i = 0; i < n; i++) {
    sb5.append(i).append(" ");
}
String result = sb5.toString();
System.out.println("Length = " + result.length());
Length = 48895 (примерно)

Пример 6: append с null объектом добавляет "null".

Пример java
StringBuilder sb6 = new StringBuilder();
sb6.append((Object) null);
System.out.println("[" + sb6 + "]"); // [null]
[null]

Пример 7: Использование append с StringBuilder из другого StringBuilder (копирование).

Пример java
StringBuilder source = new StringBuilder("source");
StringBuilder dest = new StringBuilder("dest ");
dest.append(source); // dest теперь "dest source"
System.out.println(dest);
dest source

Пример 8: append с форматированием через Formatter (не метод append, но совместно).

Пример java
StringBuilder sb7 = new StringBuilder();
Formatter formatter = new Formatter(sb7);
formatter.format("Value: %d, Text: %s", 42, "answer");
System.out.println(sb7); // Value: 42, Text: answer
Value: 42, Text: answer

джава StringBuilder.append function comments

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