mercoledì 20 ottobre 2010

API - Stringhe

Le API di Java relative alle Stringhe sono:

  • 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:
  1. charAt() - restituisce il carattere all'indice indicato: "ciao mondo".charAt(2) torna 'a';
  2. concat() - equivalente all'operatore "+"
  3. equalsIgnoreCase() - equivalente a toUpperCase().equals( obj.toUpperCase() ) ;
  4. length() - restituisce la lunghezza della stringa
  5. replace() - sostituisce un carattere nella stringa con un altro
  6. substring() - restituisce una sottostringa a partire dall'indice (start) fino a (end-1)
  7. toLowerCase() - restituisce una stringa con tutti i caratteri minuscoli
  8. toString() - restituisce la stringa 
  9. toUpperCase() - restituisce una stringa con tutti i caratteri maiuscoli
  10. trim() - restituisce una stringa senza spazi ne prima ne dopo (quindi cancella tutti i '\n', ' ', '\r')  
StringBuilder
L'unica differenza tra StringBufferStringBuilder è 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