Java Language
StringBuilder
Поиск…
Вступление
Класс Java StringBuilder используется для создания изменяемой (модифицируемой) строки. Класс Java StringBuilder аналогичен классу StringBuffer, за исключением того, что он не синхронизирован. Он доступен с JDK 1.5.
Синтаксис
новый StringBuilder ()
новый StringBuilder (int capacity)
новый StringBuilder (CharSequence seq)
новый StringBuilder (построитель StringBuilder)
новый StringBuilder (строка строки)
новый StringJoiner (разделитель CharSequence)
новый StringJoiner (разделитель CharSequence, префикс CharSequence, суффикс CharSequence)
замечания
Создание нового StringBuilder
с типом char
в качестве параметра приведет к вызывая конструктор с аргументом int capacity
, а не один с аргументом String string
:
StringBuilder v = new StringBuilder('I'); //'I' is a character, "I" is a String.
System.out.println(v.capacity()); --> output 73
System.out.println(v.toString()); --> output nothing
Повторить строку n раз
Задача: создать String
содержащую n
повторений String s
.
Тривиальный подход будет многократно конкатенировать String
final int n = ...
final String s = ...
String result = "";
for (int i = 0; i < n; i++) {
result += s;
}
Это создает n
новых экземпляров строк, содержащих от 1 до n
повторений s
приводит к времени выполнения O(s.length() * n²) = O(s.length() * (1+2+...+(n-1)+n))
.
Чтобы избежать этого StringBuilder
следует использовать, что позволяет создавать String
в O(s.length() * n)
:
final int n = ...
final String s = ...
StringBuilder builder = new StringBuilder();
for (int i = 0; i < n; i++) {
builder.append(s);
}
String result = builder.toString();
Сравнение StringBuffer, StringBuilder, Formatter и StringJoiner
В StringBuffer
, StringBuilder
, Formatter
и StringJoiner
классы классы утилиты Java SE, которые используются в основном для сборки строк из другой информации:
Класс
StringBuffer
присутствует с Java 1.0 и предоставляет множество методов для создания и модификации «буфера», содержащего последовательность символов.Класс
StringBuilder
был добавлен в Java 5 для решения проблем производительности с исходным классомStringBuffer
. API-интерфейсы для двух кланов по существу одинаковы. Основное различие междуStringBuffer
иStringBuilder
заключается в том, что первое является потокобезопасным и синхронизированным, а второе - нет.
В этом примере показано, как можно использовать StringBuilder
:
int one = 1;
String color = "red";
StringBuilder sb = new StringBuilder();
sb.append("One=").append(one).append(", Color=").append(color).append('\n');
System.out.print(sb);
// Prints "One=1, Colour=red" followed by an ASCII newline.
(Класс StringBuffer
используется одинаково: просто измените StringBuilder
на StringBuffer
в приведенном выше)
Классы StringBuffer
и StringBuilder
подходят как для сборки, так и для изменения строк; т.е. они предоставляют методы для замены и удаления символов, а также их добавления в различные. Восстановление двух классов зависит от задачи сборки строк.
Класс
Formatter
был добавлен в Java 5 и свободно моделируется функциейsprintf
в стандартной библиотеке C. Он принимает строку формата со встроенными спецификаторами формата и последовательности других аргументов и генерирует строку путем преобразования аргументов в текст и замены их вместо спецификаторов формата. Подробности спецификаторов формата говорят о том, как аргументы преобразуются в текст.Класс
StringJoiner
был добавлен в Java 8. Это специальный форматир специального назначения, который лаконично форматирует последовательность строк с разделителями между ними. Он разработан с полным API и может использоваться с потоками Java 8.
Вот некоторые типичные примеры использования Formatter
:
// This does the same thing as the StringBuilder example above
int one = 1;
String color = "red";
Formatter f = new Formatter();
System.out.print(f.format("One=%d, colour=%s%n", one, color));
// Prints "One=1, Colour=red" followed by the platform's line separator
// The same thing using the `String.format` convenience method
System.out.print(String.format("One=%d, color=%s%n", one, color));
Класс StringJoiner
не идеален для вышеуказанной задачи, поэтому здесь приведен пример форматирования массива строк.
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (String s : new String[]{"A", "B", "C"}) {
sj.add(s);
}
System.out.println(sj);
// Prints "[A, B, C]"
Варианты использования для 4 классов можно суммировать:
-
StringBuilder
подходит для любой задачи сборки строки или изменения строки. -
StringBuffer
использует (только), когда вам нужна потоковая версияStringBuilder
. -
Formatter
предоставляет гораздо более богатые функции форматирования строк, но не так эффективен, какStringBuilder
. Это связано с тем, что каждый вызовFormatter.format(...)
влечет за собой:- разбор строки
format
, - создание и заполнение массива varargs и
- autoboxing любые примитивные аргументы типа.
- разбор строки
-
StringJoiner
обеспечиваетStringJoiner
и эффективное форматирование последовательности строк с разделителями, но не подходит для других задач форматирования.