# String è speciale

Una `String` in Java, contiene una sequenza immutabile di caratteri unicode. A differenza del C/C++ dove una stringa è semplicemente un array di char , una `String` in Java è una classe di `java.lang`.

Una `String` in  Java è comunque spaciale. A differenza di una classe ordinaria:

* Una String è associata con una string literal che ha la forma di un testo tra doppie virgolette, esempio: _"Hello World"_. Si può assegnate una string literal direttamente a una variabile di tipo `String` direttamente, senza invocare `new` per creare un'istanza di String da asseganre alla variabile.
* l'operatore '+' è overloaded per concatenare due  operandi di tipo`String`.  l'operatore + non funziona con altri oggetti di tipo ad esempio `Point` o `Circle`.
* Un oggetto di tipo `String` è immutabile. Infatti il contenuto non può essere modificatouna volta che l'ggetto di tipo `String` è creato. Ad esempio il metodo `toUpperCase()` costruisce e ritorna una nuova `String` invece di modificare il contenuto dell'oggetto `String`.

Vedi per tutorial: [http://www3.ntu.edu.sg/home/ehchua/programming/java/J3d\_String.html](http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaEnum.html)

Esempi: [https://github.com/checksound/StringIsSpecial](https://github.com/checksound/StringIsSpecial)

### StringBuffer & StringBuilder

Come detto, gli oggetti di tipo String sono immutabili perchè oggetti di tipo String literals con lo stesso contenuto condividono la stessa zona di memoria nel pool delle stinghe. La modifica di una stringa causerebbe anche la modifica anche di quelle che condividono la stessa zona di memoria.

Per modificare le stringhe il JDK fornisce due classi che supportano le stringhe mutabili.  Le classi sono`StringBuffer` e `StringBuilder` (nel package core `java.lang`) .  Un oggetto di  `StringBuffer` o`StringBuilder` è come un oggetto ordinario, che sono memorizzati nello heap e non condivisi, e quindi, possono essere modificat senza effetti indesiderati su altri oggetti.

La classe `StringBuilder` fu introdotta  nel JDK 1.5. E' la stessa come funzionalità di `StringBuffer` , unica differenza che `StringBuilder`non è _synchronized_ per operazioni multi-thread. Tuttavia, per programmi single-thread, `StringBuilder`, senza l'overhead della sincronizzazione, è più efficiente.



