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
StringBufferjest obecna od Java 1.0 i zapewnia wiele metod budowania i modyfikowania „bufora” zawierającego sekwencję znaków.Klasa
StringBuilderzostał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ędzyStringBufferiStringBuilderjest 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
Formatterzostała dodana w Javie 5 i jest luźno modelowana na funkcjisprintfw 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
StringJoinerzostała dodana w Javie 8. Jest toStringJoinerspecjalnego 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ć:
-
StringBuildernadaje się do każdego zadania składania łańcucha LUB modyfikacji łańcucha. -
StringBufferużyj (tylko), gdy potrzebujesz bezpiecznej dla wątków wersjiStringBuilder. -
Formatterzapewnia 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
-
StringJoinerzapewnia zwięzłe i wydajne formatowanie sekwencji ciągów z separatorami, ale nie nadaje się do innych zadań formatowania.