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и эффективное форматирование последовательности строк с разделителями, но не подходит для других задач форматирования.