Java Language
StringBuilder
Ricerca…
introduzione
La classe Java StringBuilder viene utilizzata per creare una stringa mutabile (modificabile). La classe Java StringBuilder è uguale alla classe StringBuffer, tranne per il fatto che non è sincronizzata. È disponibile da JDK 1.5.
Sintassi
nuovo StringBuilder ()
nuovo StringBuilder (capacità int)
nuovo StringBuilder (CharSequence seq)
nuovo StringBuilder (builder StringBuilder)
new StringBuilder (stringa di stringhe)
nuovo StringJoiner (delimitatore CharSequence)
nuovo StringJoiner (delimitatore CharSequence, prefisso CharSequence, suffisso CharSequence)
Osservazioni
La creazione di un nuovo StringBuilder con tipo char come parametro comporterebbe la chiamata al costruttore con argomento int capacity e non a quello con argomento 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
Ripeti una stringa n volte
Problema: creare una String contenente n ripetizioni di una String s .
L'approccio banale dovrebbe concatenare ripetutamente la String
final int n = ...
final String s = ...
String result = "";
for (int i = 0; i < n; i++) {
result += s;
}
Questo crea n nuove istanze di stringa contenenti da 1 ad n ripetizioni di s risultante in un tempo di esecuzione di O(s.length() * n²) = O(s.length() * (1+2+...+(n-1)+n)) .
Per evitare questo, è necessario utilizzare StringBuilder , che consente invece di creare la String in 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();
Confronto tra StringBuffer, StringBuilder, Formatter e StringJoiner
Le classi StringBuffer , StringBuilder , Formatter e StringJoiner sono classi di utilità Java SE principalmente utilizzate per assemblare stringhe da altre informazioni:
La classe
StringBufferè presente da Java 1.0 e offre una varietà di metodi per la creazione e la modifica di un "buffer" contenente una sequenza di caratteri.La classe
StringBuilderè stata aggiunta in Java 5 per risolvere i problemi di prestazioni con la classeStringBufferoriginale. Le API per le due clases sono essenzialmente le stesse. La principale differenza traStringBuffereStringBuilderè che il primo è thread-safe e sincronizzato e il secondo no.
Questo esempio mostra come è possibile utilizzare 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.
(La classe StringBuffer è usata allo stesso modo: basta cambiare StringBuilder in StringBuffer nel precedente)
Le classi StringBuffer e StringBuilder sono adatte sia per assemblare che per modificare stringhe; cioè forniscono metodi per sostituire e rimuovere caratteri e aggiungerli in vari modi. Le due classi remining sono specifiche per il compito di assemblare le stringhe.
La classe
Formatterè stata aggiunta in Java 5 ed è modellata liberamente sulla funzionesprintfnella libreria standard C. Prende una stringa di formato con specificatori di formato incorporato e una sequenza di altri argomenti e genera una stringa convertendo gli argomenti in testo e sostituendoli al posto degli specificatori di formato. I dettagli degli specificatori di formato indicano come gli argomenti vengono convertiti in testo.La classe
StringJoinerè stata aggiunta in Java 8. È un programma di formattazione per scopi speciali che formatta succintamente una sequenza di stringhe con separatori tra loro. È progettato con un'API fluente e può essere utilizzato con stream Java 8.
Ecco alcuni esempi tipici di utilizzo del 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));
La classe StringJoiner non è l'ideale per l'attività di cui sopra, quindi ecco un esempio di formattazione di una matrice di stringhe.
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (String s : new String[]{"A", "B", "C"}) {
sj.add(s);
}
System.out.println(sj);
// Prints "[A, B, C]"
I casi d'uso per le 4 classi possono essere riassunti:
-
StringBuilderadatto per qualsiasi assemblaggio di stringhe o attività di modifica delle stringhe. -
StringBufferusa (solo) quando si richiede una versione thread-safe diStringBuilder. -
Formatteroffre funzionalità di formattazione delle stringhe molto più ricche, ma non è efficiente comeStringBuilder. Questo perché ogni chiamata aFormatter.format(...)comporta:- analizzando la stringa di
format, - creare e popolare un array varargs e
- autoboxing di argomenti di tipo primitivo.
- analizzando la stringa di
-
StringJoinerfornisce una formattazione succinta ed efficiente di una sequenza di stringhe con separatori, ma non è adatta per altre attività di formattazione.