Java Language
StringBuilder
Zoeken…
Invoering
De klasse Java StringBuilder wordt gebruikt om een veranderlijke (aanpasbare) tekenreeks te maken. De Java StringBuilder-klasse is dezelfde als de StringBuffer-klasse, behalve dat deze niet-gesynchroniseerd is. Het is beschikbaar sinds JDK 1.5.
Syntaxis
nieuwe StringBuilder ()
nieuwe StringBuilder (int capaciteit)
nieuwe StringBuilder (CharSequence seq)
nieuwe StringBuilder (StringBuilder builder)
nieuwe StringBuilder (String string)
nieuwe StringJoiner (CharSequence-scheidingsteken)
nieuwe StringJoiner (CharSequence-scheidingsteken, CharSequence-voorvoegsel, CharSequence-achtervoegsel)
Opmerkingen
Het maken van een nieuwe StringBuilder
met type char
als parameter zou resulteren in het aanroepen van de constructor met argument int capacity
en niet degene met argument 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
Herhaal een string n keer
Probleem: maak een String
met n
herhalingen van een String s
.
De triviale benadering zou de String
herhaaldelijk samenvoegen
final int n = ...
final String s = ...
String result = "";
for (int i = 0; i < n; i++) {
result += s;
}
Dit maakt n
nieuwe stringinstanties met 1 tot n
herhalingen van s
resulterend in een runtime van O(s.length() * n²) = O(s.length() * (1+2+...+(n-1)+n))
.
Om dit te voorkomen moet StringBuilder
worden gebruikt, waarmee in plaats daarvan de String
in O(s.length() * n)
gemaakt:
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 en StringJoiner vergelijken
De klassen StringBuffer
, StringBuilder
, Formatter
en StringJoiner
zijn Java SE-hulpprogramma's die voornamelijk worden gebruikt voor het samenstellen van tekenreeksen uit andere informatie:
De klasse
StringBuffer
is aanwezig sinds Java 1.0 en biedt een verscheidenheid aan methoden voor het bouwen en wijzigen van een "buffer" met een reeks tekens.De
StringBuilder
klasse is toegevoegd in Java 5 om prestatieproblemen met de oorspronkelijkeStringBuffer
klasse aan te pakken. De API's voor de twee klassen zijn in wezen hetzelfde. Het belangrijkste verschil tussenStringBuffer
enStringBuilder
is dat de eerste thread-safe en gesynchroniseerd is en de laatste niet.
Dit voorbeeld laat zien hoe StringBuilder
kan worden gebruikt:
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.
(The StringBuffer
klasse wordt gebruikt op dezelfde manier: gewoon verandering StringBuilder
om StringBuffer
in de hierboven)
De klassen StringBuffer
en StringBuilder
zijn geschikt voor het samenstellen en wijzigen van tekenreeksen; dat wil zeggen, ze bieden methoden voor het vervangen en verwijderen van tekens en het toevoegen ervan in verschillende. De remining twee klassen zijn specifiek voor de taak van het samenstellen van tekenreeksen.
De
Formatter
klasse is toegevoegd in Java 5 en is losjes gemodelleerd naar desprintf
functie in de C-standaardbibliotheek. Het duurt een format string met ingebedde formaat opdrachtgevers en sequenties van andere argumenten, en genereert een reeks door het omzetten van de argumenten in tekst en vervang ze in plaats van het formaat bestekschrijvers. De details van de opmaakspecificaties geven aan hoe de argumenten worden omgezet in tekst.De
StringJoiner
klasse is toegevoegd in Java 8. Het is een formatter voor speciale doeleinden die een reeks tekenreeksen bondigStringJoiner
met scheidingstekens ertussen. Het is ontworpen met een vloeiende API en kan worden gebruikt met Java 8-streams.
Hier zijn enkele typische voorbeelden van Formatter
gebruik:
// 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));
De StringJoiner
klasse is niet ideaal voor de bovenstaande taak, dus hier is een voorbeeld van een opmaak van een reeks tekenreeksen.
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (String s : new String[]{"A", "B", "C"}) {
sj.add(s);
}
System.out.println(sj);
// Prints "[A, B, C]"
De use-cases voor de 4 klassen kunnen worden samengevat:
-
StringBuilder
geschikt voor elke stringassemblage OF stringwijzigingstaak. -
StringBuffer
gebruikt (alleen) wanneer u een thread-veilige versie vanStringBuilder
. -
Formatter
biedt veel rijkere functionaliteit voorStringBuilder
, maar is niet zo efficiënt alsStringBuilder
. Dit komt omdat elke aanroep naarFormatter.format(...)
meebrengt:- ontleden van de
format
string, - een varargs- array maken en vullen, en
- argumenten van het primitieve type autoboxen.
- ontleden van de
-
StringJoiner
biedt beknopte en efficiënte opmaak van een reeks tekenreeksen met scheidingstekens, maar is niet geschikt voor andere opmaaktaken.