Поиск…


Вступление

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow