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 classeStringBuffer
originale. Le API per le due clases sono essenzialmente le stesse. La principale differenza traStringBuffer
eStringBuilder
è 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 funzionesprintf
nella 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:
-
StringBuilder
adatto per qualsiasi assemblaggio di stringhe o attività di modifica delle stringhe. -
StringBuffer
usa (solo) quando si richiede una versione thread-safe diStringBuilder
. -
Formatter
offre 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
-
StringJoiner
fornisce una formattazione succinta ed efficiente di una sequenza di stringhe con separatori, ma non è adatta per altre attività di formattazione.