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 klasy StringBuffer . Interfejsy API dla dwóch klauzul są zasadniczo takie same. Główną różnicą między StringBuffer i StringBuilder 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 funkcji sprintf 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 to StringJoiner 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 wersji StringBuilder .
  • Formatter zapewnia znacznie bogatszą funkcjonalność formatowania ciągów, ale nie jest tak wydajny jak StringBuilder . Jest tak, ponieważ każde wywołanie Formatter.format(...) pociąga za sobą:
    • parsowanie ciągu format ,
    • tworzenie i wypełnianie tablicy varargs oraz
    • autoboxowanie wszelkich argumentów typu pierwotnego.
  • StringJoiner zapewnia zwięzłe i wydajne formatowanie sekwencji ciągów z separatorami, ale nie nadaje się do innych zadań formatowania.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow