Java Language
StringBuilder
Szukaj…
Wprowadzenie
Klasa Java StringBuilder służy do tworzenia ciągów zmiennych (modyfikowalnych). Klasa Java StringBuilder jest taka sama jak klasa StringBuffer, tyle że nie jest zsynchronizowana. Jest dostępny od wersji JDK 1.5.
Składnia
new StringBuilder ()
nowy StringBuilder (int pojemność)
nowy StringBuilder (sekwencja CharSequence)
nowy StringBuilder (konstruktor StringBuilder)
nowy StringBuilder (ciąg znaków)
nowy StringJoiner (ogranicznik CharSequence)
nowy StringJoiner (separator CharSequence, prefiks CharSequence, sufiks CharSequence)
Uwagi
Utworzenie nowego StringBuilder
z typem char
jako parametrem spowodowałoby wywołanie konstruktora z argumentem int capacity
a nie z argumentem 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
Powtórz ciąg n razy
Problem: Utwórz String
zawierający n
powtórzeń ciągu String s
.
Trywialne podejście polegałoby na wielokrotnym łączeniu String
final int n = ...
final String s = ...
String result = "";
for (int i = 0; i < n; i++) {
result += s;
}
Tworzy to n
nowych instancji ciągu zawierających od 1 do n
powtórzeń s
co daje czas działania O(s.length() * n²) = O(s.length() * (1+2+...+(n-1)+n))
.
Aby uniknąć tego StringBuilder
powinien być użyty, który umożliwia tworzenie się String
w O(s.length() * n)
zamiast:
final int n = ...
final String s = ...
StringBuilder builder = new StringBuilder();
for (int i = 0; i < n; i++) {
builder.append(s);
}
String result = builder.toString();
Porównywanie StringBuffer, StringBuilder, Formatter i StringJoiner
Klasy StringBuffer
, StringBuilder
, Formatter
i StringJoiner
klasy narzędziowe Java SE, które są przede wszystkim używane do zestawiania ciągów z innych informacji:
Klasa
StringBuffer
jest obecna od Java 1.0 i zapewnia wiele metod budowania i modyfikowania „bufora” zawierającego sekwencję znaków.Klasa
StringBuilder
została dodana w Javie 5, aby rozwiązać problemy z wydajnością oryginalnej klasyStringBuffer
. Interfejsy API dla dwóch klauzul są zasadniczo takie same. Główną różnicą międzyStringBuffer
iStringBuilder
jest to, że ten pierwszy jest bezpieczny dla wątków i zsynchronizowany, a drugi nie.
Ten przykład pokazuje, jak można użyć 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.
(Klasa StringBuffer
jest używana w ten sam sposób: wystarczy zmienić StringBuilder
na StringBuffer
w powyższym przykładzie)
Klasy StringBuffer
i StringBuilder
są odpowiednie zarówno do zestawiania, jak i modyfikowania ciągów; tzn. zapewniają metody zastępowania i usuwania znaków, a także dodawania ich w różnych. Przypominanie dwóch klas jest specyficzne dla zadania składania łańcuchów.
Klasa
Formatter
została dodana w Javie 5 i jest luźno modelowana na funkcjisprintf
w standardowej bibliotece C. Pobiera ciąg formatu z osadzonymi specyfikatorami formatu i sekwencje innych argumentów, i generuje ciąg, konwertując argumenty na tekst i zastępując je zamiast specyfikatorów formatu. Szczegóły specyfikatorów formatu mówią, w jaki sposób argumenty są konwertowane na tekst.Klasa
StringJoiner
została dodana w Javie 8. Jest toStringJoiner
specjalnego przeznaczenia, który zwięźle formatuje sekwencję ciągów znaków z separatorami między nimi. Jest zaprojektowany z płynnym API i może być używany ze strumieniami Java 8.
Oto kilka typowych przykładów użycia 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));
Klasa StringJoiner
nie jest idealna do powyższego zadania, dlatego oto przykład formatowania tablicy ciągów znaków.
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (String s : new String[]{"A", "B", "C"}) {
sj.add(s);
}
System.out.println(sj);
// Prints "[A, B, C]"
Przypadki użycia dla 4 klas można podsumować:
-
StringBuilder
nadaje się do każdego zadania składania łańcucha LUB modyfikacji łańcucha. -
StringBuffer
użyj (tylko), gdy potrzebujesz bezpiecznej dla wątków wersjiStringBuilder
. -
Formatter
zapewnia znacznie bogatszą funkcjonalność formatowania ciągów, ale nie jest tak wydajny jakStringBuilder
. Jest tak, ponieważ każde wywołanieFormatter.format(...)
pociąga za sobą:- parsowanie ciągu
format
, - tworzenie i wypełnianie tablicy varargs oraz
- autoboxowanie wszelkich argumentów typu pierwotnego.
- parsowanie ciągu
-
StringJoiner
zapewnia zwięzłe i wydajne formatowanie sekwencji ciągów z separatorami, ale nie nadaje się do innych zadań formatowania.