Le stringhe

Una stringa è una sequenza di caratteri

Questo tipo di dato è così importante che, in Java, gode di un trattamento speciale pur NON essendo un tipo predefinito!

In Java, una stringa deve essere delimitata da doppi apici:
 
 
"Hello World!"
"54 e' piu' grande di 78"
""                     // stringa vuota

Qualunque carattere può comparire in una stringa, utilizzando, se necessario, una sequenza di escape.
 


System.out.println("Ha detto \"S í\"!!")
 
Ha detto "Sí"!!

System.out.println("sopra\nsotto")

 
sopra
sotto
System.out.println("il file C:\\Documenti\\readme.txt")
 
il file C:\Documenti\readme.txt
System.out.println("il carattere \u0041 e' la A in UNICODE");
System.out.println("il carattere \\u0041 e' la A in UNICODE");
 
il carattere A e' la A in UNICODE
il carattere \u0041 e' la A in UNICODE



Le stringhe sono oggetti!

Le stringhe sono oggetti della classe String.

Le stringhe però sono oggetti immutabili: una volta creati il loro contenuto non può essere modificato:

  • una volta creato un oggetto di tipo String non avremo a disposizione metodi per modificare tale oggetto ma solo per leggerlo o per leggerne alcune sue parti
Abbiamo detto che le stringhe sono un tipo di dato così importante che gode di un trattamento speciale:

  • per creare un oggetto di tipo String (differentemente da quello che concerne gli altri oggetti) non abbiamo bisogno di invocare il metodo new.

Si possono dichiarare variabili di classe String e assegnare loro stringhe arbitrarie.

Per leggere valori di tipo String si può usare il metodo Input.readString().

Per stampare stringhe:  System.out.println(...) e System.out.print(...)

 
 
String nome = "Carlo";
String cognome;
cognome = "Rossi";
nome = "Paolo  ";

System.out.print(nome);  // non va a capo 
System.out.println(cognome);
 

Paolo  Rossi




La classe String

La classe String [locale, Medialab, Sun] definisce molti metodi d'istanza utili.

Lunghezza di una stringa:
 
String hello = "Hello, World!";
int lung = hello.length();
System.out.println(lung); // stampa 13

Estrazione di una sottostringa:
 
str.substring(start, pastEnd)

Restituisce la sottostringa di str a partire dalla posizione start fino a  pastEnd - 1.

Attenzione: il primo carattere di una stringa ha posizione 0, e l'ultimo ha posizione str.length()-1.

H e l l o ,   W o r l d ! carattere
0 1 2 3 4 5 6 7 8 9 10 11 12 posizione

String saluto = "Hello, World!";
System.out.println(saluto.substring(7,12)); //stampa World




Concatenazione di Stringhe

La concatenazione di due stringhe "Mario" e "Rossi" è la stringa "MarioRossi".
L'operatore di concatenazione in Java si scrive semplicemente con il simbolo + .
 
String nome = "Mario";
String cognome = "Rossi";
System.out.println(nome + cognome); //stampa MarioRossi
System.out.println(nome + " " + cognome); 
                                 //stampa Mario Rossi

L'operatore + è sovraccaricato (overloaded): può essere applicato sia a numeri che a stringhe.

Cosa succede se si mischiano numeri e stringhe in una espressione?

System.out.println("Rai" + 3);         //stampa Rai3
System.out.println(3 + 4 + 5);         //stampa 12
System.out.println("" + 3 + 4 + 5);    //stampa 345
System.out.println(4 + 5 + "pippo");   //stampa 9pippo

La concatenazione è molto utile per ridurre il numero degli enunciati System.out.print(...) .

Per esempio possiamo combinare :

System.out.print("L'interesse dopo un anno e': "); //stampa L'interesse dopo un anno e':
System.out.println(interesse);                //stampa 43.9 sulla stessa riga e va a capo

nella singola invocazione:

System.out.println("L'interesse dopo un anno e': " + interesse);
                                          //stampa L'interesse dopo un anno e': 43.9

Documentazione della classe String [locale, Medialab, Sun].




Conversione tra numeri e stringhe

Da numero a stringa: concatenazione con la stringa vuota

Da stringa a numero: metodi Integer.parseInt() o Double.parseDouble()

 
 
int riv = 1789;
String riv_string = riv; // incompatible types
                         // found   : int
                         // required: java.lang.String

String riv_string = "" + riv;    // OK

double pi = "3.1415926"; // incompatible types
                         // found   : java.lang.String
                         // required: double

double pi = Double.parseDouble("3.1415926"); // OK

int miliardo = Integer.parseInt("1000000000"); // OK




Confronto tra stringhe

Due tipi di confronto tra stringhe:
  1. Sono uguali? Cioè, sono la stessa sequenza di caratteri?
  2. Quale delle due stringhe viene prima in ordine lessicografico?
La classe String fornisce i metodi d'istanza necessari: equals e compareTo
  • s1.equals(s2) restituisce:
    • true se s1 e s2 sono uguali come sequenze di caratteri,
    • false altrimenti. 
String s1 = "Ciao";
String s2 = Input.readString();
boolean b = s1.equals(s2); 
Input: Ciao
b vale true

Attenzione:   Come per tutti gli oggetti, non usare "==" per confrontare stringhe: può dare risultati inattesi.
 

String s1 = "Ciao";
String s2 = "Ciao"
boolean b = (s1 == s2); 
b  vale  true
String s1 = "Ciao";
String s2 = Input.readString();
boolean b = (s1 == s2); 
Input: Ciao
b  vale  false!!!
  • s1.compareTo(s2) è:
    • un valore minore di 0 se s1 precede s2 lessicograficamente,
    • un valore maggiore di 0 se s2 precede s1,
    • il valore 0 se sono uguali.
b = "cargo".compareTo("cathode") < 0; b vale true

Il metodo d'istanza compareTo può essere utilizzato ad esempio nella scrittura di algoritmi di ordinamento di sequenze di stringhe.




La stringa vuota e l'oggetto null

Come avviene per tutte le classi, esiste un valore particolare che può essere associato ad una variabile di tipo String per indicare che quella variabile non riferisce alcun oggetto.

Questo valore, indipendentemente dalla classe, è chiamato null.

Sul valore null non è possibile invocare metodi (si verificherebbe un errore di esecuzione). Per prevenire tali errori, si può testare l'uguaglianza con null usando ==.

Il valore null non deve essere confuso con la stringa vuota "" (quella di lunghezza 0, che non contiene caratteri), che è un oggetto ben definito:

  • è possibile invocare metodi su una stringa vuota;
  • il confronto di uguaglianza con la stringa vuota deve essere fatto con il metodo equals(...);

Per il momento ricordate soltanto che null esiste, anche se non avrete bisogno di usarlo nei prossimi programmi.