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 classe StringBuffer originale. Le API per le due clases sono essenzialmente le stesse. La principale differenza tra StringBuffer e StringBuilder è 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 funzione sprintf 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 di StringBuilder .
  • Formatter offre funzionalità di formattazione delle stringhe molto più ricche, ma non è efficiente come StringBuilder . Questo perché ogni chiamata a Formatter.format(...) comporta:
    • analizzando la stringa di format ,
    • creare e popolare un array varargs e
    • autoboxing di argomenti di tipo primitivo.
  • StringJoiner fornisce una formattazione succinta ed efficiente di una sequenza di stringhe con separatori, ma non è adatta per altre attività di formattazione.


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow