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

Метод StringBuilder.toString в языке Java
Раздел: Строки (String) - части строк (StringBuilder, StringBuffer)
StringBuilder.toString: String

Описание метода toString()

Метод StringBuilder.toString() преобразует текущую последовательность символов объекта StringBuilder в неизменяемый объект String. Он используется, когда требуется получить итоговую строку после всех операций добавления, вставки или замены. Метод не принимает аргументов и возвращает объект типа String, содержащий те же символы, что и StringBuilder на момент вызова. Вызов toString() не изменяет сам StringBuilder – его можно продолжать использовать для дальнейших модификаций. Внутренняя реализация может возвращать кэшированную строку или создавать новую копию массива символов в зависимости от версии Java и наличия изменений после последнего вызова.

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

Простой пример создания и преобразования:

StringBuilder sb = new StringBuilder("Привет");
sb.append(", мир!");
String result = sb.toString();
System.out.println(result);
Привет, мир!

Использование цепочки вызовов:

String s = new StringBuilder()
    .append("Java")
    .append(" ")
    .append("17")
    .toString();
System.out.println(s);
Java 17

Пустой StringBuilder:

StringBuilder empty = new StringBuilder();
System.out.println(empty.toString().isEmpty());
true

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

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

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

String.valueOf() – преобразует другие типы (int, char[] и т.д.) в строку, но не заменяет накопление последовательности символов.

CharSequence.toString() – интерфейс, реализуемый StringBuilder. Можно использовать полиморфно, если метод ожидает CharSequence.

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

PHP: метод (string) или implode() для массивов. Класс StringBuilder отсутствует, но есть Stringable интерфейс. Пример:

$sb = '';
$sb .= 'Hello ';
$sb .= 'World';
echo $sb; // результат: Hello World
Hello World

JavaScript: нет встроенного StringBuilder. Используют массив и join(''):

const parts = ['Hello', ' ', 'World'];
const result = parts.join('');
console.log(result);
Hello World

Python: метод ''.join(list) для сборки строки. Пример:

parts = ['Hello', ' ', 'World']
result = ''.join(parts)
print(result)
Hello World

C#: класс StringBuilder с методом ToString() – идентичен Java.

StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");
string result = sb.ToString();
Console.WriteLine(result);
Hello World

Go: strings.Builder с методом String():

var sb strings.Builder
sb.WriteString("Hello ")
sb.WriteString("World")
result := sb.String()
fmt.Println(result)
Hello World

Kotlin: функция buildString возвращает String:

val result = buildString {
    append("Hello ")
    append("World")
}
println(result)
Hello World

Основное отличие – в других языках аналоги часто являются единственным способом эффективной сборки строк, тогда как в Java есть несколько вариантов (StringBuilder, StringBuffer, конкатенация).

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

Забытый вызов toString(). Переменная типа StringBuilder передаётся туда, где ожидается String. Компилятор выдаст ошибку.

StringBuilder sb = new StringBuilder("data");
// Ошибочно: String s = sb;
String s = sb.toString(); // правильно

Путаница с StringBuffer. Использование StringBuffer в однопоточном коде снижает производительность. Выбор должен быть осознанным.

Многократный вызов toString() без сохранения. Каждый вызов может создавать новую строку – снижение производительности.

StringBuilder sb = new StringBuilder("a");
String s1 = sb.toString(); // создаётся строка "a"
sb.append("b");
String s2 = sb.toString(); // создаётся новая строка "ab"
// Если нужна только последняя, не нужно вызывать toString после каждого append

NullPointerException. Вызов toString() на null-ссылке StringBuilder вызовет исключение.

StringBuilder sb = null;
// sb.toString(); // NullPointerException

Изменения в версиях

Метод StringBuilder.toString() не претерпел изменений сигнатуры или поведения с момента введения класса в Java 1.5. В Java 9 была изменена внутренняя реализация для поддержки компактных строк (Latin-1 кодировка), но для пользователя результат остался прежним – возвращается объект String. В Java 11 и позднее не вносилось никаких изменений, связанных с этим методом. Таким образом, код, использующий toString(), полностью обратно совместим.

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

1. Построение CSV строки с использованием цикла. Сборка данных из массива в формат CSV:

Пример java
String[] headers = {"Имя", "Возраст", "Город"};
String[][] rows = {
    {"Анна", "25", "Москва"},
    {"Иван", "30", "СПб"}
};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rows.length; i++) {
    for (int j = 0; j < rows[i].length; j++) {
        sb.append(rows[i][j]);
        if (j < rows[i].length - 1) sb.append(",");
    }
    sb.append("\n");
}
String csv = sb.toString();
System.out.println(csv);
Анна,25,Москва
Иван,30,СПб

2. Использование toString() внутри лямбда-выражений. Например, для форматирования:

Пример java
List items = List.of("a", "b", "c");
String result = items.stream()
    .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
    .toString();
System.out.println(result); // результат: abc
abc

3. Сравнение производительности с конкатенацией через +. Демонстрация преимущества StringBuilder внутри цикла:

Пример java
int n = 10000;
StringBuilder sb = new StringBuilder();
long start = System.nanoTime();
for (int i = 0; i < n; i++) {
    sb.append("x");
}
String s1 = sb.toString();
long end = System.nanoTime();
System.out.println("StringBuilder: " + (end - start) + " ns");

start = System.nanoTime();
String s2 = "";
for (int i = 0; i < n; i++) {
    s2 += "x";
}
end = System.nanoTime();
System.out.println("String +: " + (end - start) + " ns");
StringBuilder: 150000 ns
String +: 35000000 ns (примерно)

4. Использование substring после toString. Преобразование и выделение подстроки:

Пример java
StringBuilder sb = new StringBuilder("0123456789");
String full = sb.toString();
String part = full.substring(3, 7);
System.out.println(part); // результат: 3456
3456

джава StringBuilder.toString function comments

En
StringBuilder.toString Returns a string representing the data in this sequence