- String
- StringBuffer
- StringBuilder
String
String a = "abc"; //crea "abc" nella pool
String b = new String("abc"); //crea una variabile String nell'heap e "abc" nella pool
Il secondo metodo crea una variabile in più; meglio il primo.
I metodi che bisogna conoscere per la certificazione sono:
- charAt() - restituisce il carattere all'indice indicato: "ciao mondo".charAt(2) torna 'a';
- concat() - equivalente all'operatore "+"
- equalsIgnoreCase() - equivalente a toUpperCase().equals( obj.toUpperCase() ) ;
- length() - restituisce la lunghezza della stringa
- replace() - sostituisce un carattere nella stringa con un altro
- substring() - restituisce una sottostringa a partire dall'indice (start) fino a (end-1)
- toLowerCase() - restituisce una stringa con tutti i caratteri minuscoli
- toString() - restituisce la stringa
- toUpperCase() - restituisce una stringa con tutti i caratteri maiuscoli
- trim() - restituisce una stringa senza spazi ne prima ne dopo (quindi cancella tutti i '\n', ' ', '\r')
StringBuilder
L'unica differenza tra StringBuffer e StringBuilder è che il secondo è stato introdotto per risolvere l'eccessiva pesantezza dello StringBuffer in contesti in cui la gestione dei Thread deve essere fatta esternamente; StringBuffer infatti è sincronizzato internamente, mentre StringBuilder non lo è (e quindi è più veloce).
Mostriamo subito un caso in cui la sincronizzazione interna non funziona:
1 - StringBuffer sb = new StringBuffer();
2 - sb.append("ciao");
3 - sb.append(" ");
4 - sb.append("mondo");
se avviamo due Thread e il primo esegue riga 1 e 2, poi la jvm lo blocca e avvia il secondo, che esegue 1,2,3,4, ci ritroviamo con la stringa "ciaociao mondo mondo", sicuramente differente da ciò che volevamo noi; per questo motivo dobbiamo gestire la sincronizzazione esternamente, e possiamo evitare di usare lo StringBuffer, che è più pesante dello StringBuilder.
Metodi da conoscere per la certificazione:
- append(String s) - accoda la stringa s al nostro buffer e restituisce il buffer
- delete(int start, int end) - cancella una parte del testo (da posizione start a posizione end - 1)
- insert(int offset, String s) - inserisce la stringa s nella posizione offset
- reverse() - inverte la stringa
- toString() - restituisce il valore come stringa
Gli StringBu**er e le String vengono spesso utilizzate tramite concatenazione di metodi; nell'esame di certificazione troverete tanti codici nella forma:
String a = "ciao mondo".toUpperCase() + "!!!"
StringBuilder sb = new StringBuilder().append("ciao").append(" ").append("mondo").reverse();
E' quindi importante capire come funziona, cioè che partendo da sinistra verso destra vengono eseguiti tutti i metodi, e viene restituito solo il valore finale.
Altre cosa importante da ricordare è che le stringhe sono immutabili e gli StringBuffer/Builder no; quindi le domande trabocchetto:
String a = "ciao";
System.out.println(a.concat(" mondo"));
System.out.println(a.concat("!!!"));
richiederanno attenzione, perché gli output sono "ciao mondo" e "ciao!!!";
Nessun commento:
Posta un commento