"Saluti, Amico!"

"Ciao Rishi!"

"Ora sai abbastanza sulle stringhe per imparare qualcosa di interessante. Più specificamente, una nuova classe simile, ma non esattamente uguale, alla classe String."

"Sembra intrigante, anche se non mi è del tutto chiaro come le stringhe ordinarie non siano all'altezza e perché siano necessarie altre classi simili a stringhe."

"Cominciamo dal fatto che le stringhe sono oggetti immutabili in Java."

"Com'è? L'ho dimenticato... o non l'ho mai saputo fin dall'inizio..."

"Lascia che ti ricordi che gli oggetti immutabili sono quelli i cui stati non possono essere cambiati dopo essere stati creati."

"Ahhh... Perché le stringhe sono immutabili in Java?"

"Questo è stato fatto per rendere la classe String altamente ottimizzata e per consentirne l'utilizzo ovunque. Ad esempio, solo i tipi immutabili sono consigliati per l'uso come chiavi nella raccolta HashMap .

"Tuttavia, si verificano spesso situazioni in cui i programmatori troverebbero più conveniente che la classe String sia mutabile. Vogliono una classe che non crei una nuova sottostringa ogni volta che viene chiamato uno dei suoi metodi."

"Ma a cosa serve?"

"Bene, supponiamo di avere una stringa molto grande e di dover aggiungere frequentemente qualcosa alla fine di essa. In questo caso, anche una raccolta di caratteri ( ) ArrayList<Character>può essere più efficiente della ricreazione e concatenazione costante di oggetti String."

"Ed è per questo che abbiamo bisogno di stringhe che non siano esattamente la classe String?"

"Esattamente. Il linguaggio Java ha aggiunto un tipo simile a String che può essere modificato. Si chiama StringBuilder".

Creazione di un oggetto

"Per creare un StringBuilderoggetto basato su una stringa esistente, devi eseguire un'istruzione come:

StringBuilder name = new StringBuilder(string);

"Per creare una stringa mutabile vuota, è necessario utilizzare un'istruzione come questa:

StringBuilder name = new StringBuilder();

Elenco dei metodi

"La StringBuilderclasse ha due dozzine di metodi utili. Ecco i più importanti:

Metodo Descrizione
StringBuilder append(obj)
Converte l'oggetto passato in una stringa e lo accoda alla stringa corrente
StringBuilder insert(int index, obj)
Converte l'oggetto passato in una stringa e lo inserisce al centro della stringa corrente
StringBuilder replace(int start, int end, String str)
Sostituisce la parte della stringa specificata dall'intervallo start..end con la stringa passata
StringBuilder deleteCharAt(int index)
Rimuove il carattere con l'indice specificato dalla stringa
StringBuilder delete(int start, int end)
Rimuove i caratteri all'interno dell'intervallo specificato dalla stringa
int indexOf(String str, int index)
Cerca una sottostringa nella stringa corrente
int lastIndexOf(String str, int index)
Cerca una sottostringa nella stringa corrente, a partire dalla fine
char charAt(int index)
Restituisce il carattere nella stringa in corrispondenza dell'indice passato
String substring(int start, int end)
Restituisce la sottostringa definita dall'intervallo specificato
StringBuilder reverse()
Inverte la stringa corrente.
void setCharAt(int index, char)
Cambia il carattere in corrispondenza dell'indice specificato nel carattere passato
int length()
Restituisce la lunghezza della stringa in caratteri

"E ora ti descriverò brevemente ciascuno di questi metodi.

Aggiunta a una stringa

"Per aggiungere qualcosa a una stringa mutabile ( StringBuilder), utilizzare il append()metodo. Esempio:

Codice Descrizione
StringBuilder builder = new StringBuilder("Hi");
builder.append("Bye");
builder.append(123);
Hi
HiBye
HiBye123

Conversione in una stringa standard

"Per convertire un StringBuilderoggetto in un oggetto String, devi solo chiamare il suo toString()metodo. Esempio

Codice Produzione
StringBuilder builder = new StringBuilder("Hi");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Hi123

Come cancello un personaggio?

"Per eliminare un carattere in una stringa mutabile, è necessario utilizzare il deleteCharAt()metodo. Esempio:

Codice Produzione
StringBuilder builder = new StringBuilder("Hello");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Helo

Come posso sostituire parte di una stringa con un'altra stringa?

"Per questo c'è il replace(int begin, int end, String str)metodo. Esempio:

Codice Produzione
StringBuilder builder = new StringBuilder("Mellow");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
MeHello!w

"Sembra conveniente. Grazie, Rishi."

"Non menzionarlo. Che ne dici di questo, puoi capovolgere una corda all'indietro? Come lo faresti?"

"Beh... creerei un StringBuilder, ci inserirei una stringa... Poi creerei una nuova stringa, e in un ciclo dall'ultimo carattere al primo... O forse uno spostamento bit a bit...

"Non male. Ma potrebbe essere più veloce. C'è un metodo speciale per farlo - reverse();Esempio:

Codice Produzione
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

"Oltre alla StringBuilderclasse, Java ha un'altra classe simile a una stringa chiamata StringBuffer. È un analogo della StringBuilderclasse, ma i suoi metodi sono contrassegnati con il synchronizedmodificatore."

"Che cosa significa?"

"Significa che StringBufferè possibile accedere all'oggetto contemporaneamente da più thread."

"Non ho ancora molta familiarità con i thread. Ma 'è possibile accedere da più thread' è chiaramente meglio di 'non è possibile accedere da più thread'... Perché non usare sempre StringBufferallora?"

"Perché è molto più lento di StringBuilder. Potresti aver bisogno di una classe del genere quando inizi a esplorare attivamente il multithreading nella ricerca Java Multithreading .

"Lo scriverò nella mia memoria per non dimenticare. Segnato 'per il futuro'.