String - Dipartimento di Informatica e Automazione
Transcript
String - Dipartimento di Informatica e Automazione
Corso di Laurea Ingegneria Civile
Fondamenti di Informatica
Dispensa 16
Tipi riferimento e stringhe
Carla Limongelli
Maggio 2010
Definizione di metodi
1
Contenuti
Tipi riferimento
Stringhe e oggetti String
Uso di variabili riferimento
Uso di oggetti String
Stringhe e tipi primitivi
• conversione da tipi primitivi a stringhe
• il metodo charAt
Concatenazione di stringhe
Confronto tra stringhe
Riferimenti e uguaglianza
Il letterale null
Tipi riferimento e stringhe
2
Tipi riferimento
I tipi riferimento sono tipi definiti in
corrispondenza a classi
• dal punto di vista dell’utente di un tipo riferimento (classe)
– il dominio è l’insieme dei possibili oggetti che possono essere istanziati dalla
classe
– le operazioni associate al tipo riferimento sono le operazioni (metodi) definite
dalla classe
• dal punto di vista del linguaggio di programmazione, ai tipi
riferimento possono essere applicati i seguenti operatori
– l’operatore new – per la creazione di un nuovo oggetto
– l’operatore . (operatore punto) – per l’invocazione di un metodo o l’accesso a
una variabile di un oggetto
– altri operatori saranno introdotti in capitoli successivi
È sempre possibile associare un tipo alle
espressioni riferimento
• ad esempio
– "calcolatore" è una espressione del tipo riferimento String
Tipi riferimento e stringhe
3
Stringhe e oggetti String
Una stringa è una sequenza finita di caratteri
• le stringhe sono un tipo di dati di uso molto comune –
consentono di rappresentare informazioni testuali e descrittive
Java supporta la gestione di stringhe attraverso
la classe String del package java.lang
• non da un tipo primitivo – una stringa non è un tipo di dati
elementare
• un oggetto String rappresenta una sequenza di caratteri
– una sequenza finita di caratteri dell’alfabeto Unicode
• gli oggetti String sanno eseguire operazioni utili per la loro
gestione
Tipi riferimento e stringhe
4
Stringhe e oggetti String
Il valore (o contenuto) di un oggetto String è la
stringa rappresentata da quell’oggetto
• ad esempio, il letterale "calcolatore" denota un oggetto String il
cui valore è la stringa calcolatore
"calcolatore" : String
calcolatore
• in questo diagramma, l’oggetto mostrato rappresenta la stringa
calcolatore
– non viene data nessuna indicazione sulla modalità interna di
rappresentazione della stringa
– gli oggetti String (così come altri oggetti) possono essere usati
conoscendone solo l’interfaccia ma non i dettagli implementativi
Tipi riferimento e stringhe
5
Letterali stringa
Un letterale String è una stringa racchiusa tra
doppi apici " e "
• ad esempio, "calcolatore"
• il valore di un letterale String è la stringa racchiusa tra apici
(apici esclusi)
• l’uso di un letterale String è equivalente alla creazione di un
oggetto di tipo String
– il letterale "calcolatore" è sostanzialmente equivalente a una espressione
della forma new String( ... )
• un letterale String è una espressione di tipo String
– ovvero, un letterale String è una espressione di tipo String — il cui valore è
il riferimento a un oggetto String
– ad esempio, "calcolatore" è il riferimento a un oggetto String
Java fornisce un supporto speciale (ovvero,
eccezionale) per gli oggetti String
• lo si capisce già dalla presenza dei letterali String
Tipi riferimento e stringhe
6
Uso di variabili riferimento
Essendo String il nome di una classe, è
possibile dichiarare variabili di tipo String
• si tratta di variabili riferimento
– una variabile riferimento permette di memorizzare il riferimento a un oggetto
– ma non il ―valore‖ di un oggetto – che è memorizzato in un’altra area di
memoria
String stagione;
stagione = "estate";
stagione
"estate" : String
String
System.out.println(stagione);
// visualizza estate
Tipi riferimento e stringhe
7
Variabili riferimento e assegnazioni
Se a una variabile riferimento (che referenzia già un
oggetto A) viene assegnato il riferimento a un altro
oggetto B
l’oggetto A non viene sostituito dall’oggetto B
il riferimento all’oggetto A memorizzato dalla variabile viene sostituito
dal riferimento all’oggetto B
l’oggetto A continua ad esistere
String stagione;
stagione = "estate";
stagione
stagione = "inverno";
"estate" : String
String
stagione
"estate" : String
String
"inverno" : String
Tipi riferimento e stringhe
8
Un oggetto può essere referenziato da
più variabili
È possibile che un oggetto sia
contemporaneamente referenziato da più variabili
String s, t;
s = "estate";
t = s; // copia in t il riferimento memorizzato da s
s
"estate" : String
String
t
String
Tipi riferimento e stringhe
9
Le variabili sono indipendenti
Le variabili sono indipendenti
• una assegnazione a una variabile modifica il valore di una sola
variabile
String s, t;
s = "estate";
t = s;
// copia in t il riferimento
// memorizzato da s
t = "inverno";
s
"estate" : String
String
t
"inverno" : String
String
Tipi riferimento e stringhe
10
Uso di oggetti String
Che cosa è un oggetto String?
• dal punto di vista del contenuto informativo, un oggetto String
rappresenta una stringa
• dal punto di vista comportamentale, un oggetto String è un
oggetto che sa eseguire un certo numero di operazioni
– un oggetto String sa eseguire operazioni per la manipolazione di se stesso
La classe String è usata per rappresentare il
tipo delle stringhe
• un tipo è
– un insieme di elementi — l’insieme delle stringhe, in questo caso
– un insieme di operazioni, per la manipolazione degli elementi di un tale
insieme
Vengono ora descritte alcune operazioni sulle
stringhe
Tipi riferimento e stringhe
11
Il metodo int length()
Il metodo int length() della classe String
• calcola la lunghezza della stringa
• la lunghezza di una stringa è il numero di caratteri della
sequenza che costituisce la stringa
Ad esempio, l’espressione
"automobile".length() vale 10
Tipi riferimento e stringhe
12
La stringa vuota
Una stringa vuota è una sequenza vuota di
caratteri
• la stringa vuota è un oggetto String di lunghezza zero
• la stringa vuota è denotata dal letterale ""
• l’espressione "".length() vale 0
Tipi riferimento e stringhe
13
Il metodo String concat(String x)
La concatenazione è l’operazione che a partire da due
stringhe S e T calcola una nuova stringa il cui valore è
dato dalla sequenza di caratteri di S seguita dalla
sequenza di caratteri di T
• il metodo String concat(String x) della classe String
implementa l’operazione di concatenazione di stringhe
• crea e restituisce un nuovo oggetto String composto dai caratteri
della stringa su cui il metodo viene invocato, seguiti dai caratteri
della stringa argomento x
Ad esempio
String s, t, u;
s = "auto";
t = "mobile";
u = s.concat(t);
/* u vale (referenzia) "automobile" */
Tipi riferimento e stringhe
14
Concatenazione di stringhe
String s, t, u;
s = "auto";
t = "mobile";
s
"auto" : String
String
t
"mobile" : String
String
u
String
u = s.concat(t);
/* u vale (referenzia) "automobile" */
u
"automobile" : String {new}
String
Tipi riferimento e stringhe
15
Posizione dei caratteri in una stringa
Le posizioni dei caratteri di una stringa sono
numerate da sinistra verso destra
• il carattere più a sinistra (il primo) ha posizione 0
• in una stringa composta da N caratteri, il carattere più a destra
(l’ultimo) ha posizione N – 1
a u t o m o b i l e
0 1 2 3 4 5 6 7 8 9
• in generale, l’i-esimo carattere di una stringa occupa la posizione
i–1
Tipi riferimento e stringhe
16
Il metodo String substring (int inizio, int
fine)
Il metodo String substring(int inizio, int fine)
della classe String
• (crea e) restituisce un nuovo oggetto String composto dai
caratteri della stringa su cui il metodo è stato invocato che
occupano le posizioni tra inizio (inclusa) e fine (esclusa)
– detto in altro modo, la stringa restituita comprende i caratteri tra le posizioni
inizio e fine–1 (estremi inclusi)
• ad esempio
String s, t;
s = "automobile";
t = s.substring(2,6);
/* t vale "tomo" */
Tipi riferimento e stringhe
17
Il metodo String substring(int inizio)
Il metodo String substring(int inizio) della
classe String
• (crea e) restituisce un nuovo oggetto String che consiste dei
caratteri della stringa su cui il metodo viene invocato compresi tra
quello di posizione inizio e l’ultimo carattere della stringa
(incluso)
• ad esempio
String s, t;
s = "automobile";
t = s.substring(4);
/* t vale "mobile" */
Tipi riferimento e stringhe
18
Pre-condizioni delle operazioni
substring
Il metodo String substring(int inizio) è soggetto
alle seguenti pre-condizioni
• inizio deve essere maggiore o uguale a zero
• inizio deve essere minore o uguale alla lunghezza della stringa -1
Il metodo String substring(int inizio, int fine),
oltre alle precedenti, è soggetto anche alle
seguenti pre-condizioni
• fine deve essere minore o uguale alla lunghezza della stringa
• inizio deve essere minore o uguale a fine
In caso di violazione delle pre-condizioni
• viene generato un errore al tempo di esecuzione di tipo
IndexOutOfBoundsException
– ovvero di tipo indice fuori dai limiti
Tipi riferimento e stringhe
19
Il metodo int indexOf(char car)
Il metodo int indexOf(char car) della classe
String
• verifica se la stringa su cui il metodo viene invocato contiene il
carattere car
– restituisce la prima posizione in cui occorre il carattere car
– oppure restituisce il valore –1 — una posizione non valida
Ad esempio
"automobile".indexOf('m') vale 4
"automobile".indexOf('o') vale 3
"automobile".indexOf('M') vale –1
Tipi riferimento e stringhe
20
Il metodo int indexOf(String s)
Il metodo int indexOf(String s) della classe
String
• verifica se la stringa su cui il metodo viene invocato contiene la
sottostringa s
– una sottostringa di una stringa T è una sequenza di caratteri consecutivi
della stringa T
– esempi di sottostringhe di "automobile" sono "auto", "mobile", "tomo" ,
""
– esempi di stringhe che non sono sottostringhe di "automobile" sono "aule"
e "autoobile"
• restituisce la prima posizione in cui inizia una occorrenza della
stringa s — oppure il valore –1
Ad esempio
"automobile".indexOf("auto") vale 0
"automobile".indexOf("tomo") vale 2
"mamma".indexOf("ma") vale 0 – e non 3
"automobile".indexOf("aule") vale –1
Tipi riferimento e stringhe
21
Gli oggetti String sono immutabili
Un oggetto String rappresenta una stringa
costante, immutabile
• dopo la creazione, il valore di un oggetto String non può essere
modificato
– l’unico modo di interagire con un oggetto String è mediante i metodi della
classe String
– nessun metodo della classe String modifica l’oggetto su cui il metodo viene
invocato
Tipi riferimento e stringhe
22
Visualizzazione e lettura di stringhe
Per visualizzare una stringa s sullo schermo
System.out.println(s);
Per leggere una stringa dalla tastiera
s = Lettore.in.leggiLinea();
Tipi riferimento e stringhe
23
Conversione da tipi primitivi a stringhe
Si supponga di voler calcolare, a partire da un
intero N, una stringa il cui valore è il letterale per
N
• la conversione da tipi primitivi a stringhe è realizzata mediante un
certo numero di metodi di classe della classe String
– di nome valueOf
– ciascuno di questi metodi valueOf accetta come argomento il valore di un
certo tipo primitivo e restituisce un valore String che è la rappresentazione
dell’argomento sotto forma di stringa
Ad esempio
String.valueOf(16) vale "16"
String.valueOf('a') vale "a"
Tipi riferimento e stringhe
24
Il metodo charAt
Il metodo char charAt(int posizione) della classe
String permette di estrarre da una stringa il
carattere che occupa una certa posizione
• ad esempio
"automobile".charAt(0) vale 'a'
"automobile".charAt(2) vale 't'
Il metodo charAt non può essere espresso in
termini del metodo substring
• ad esempio "automobile".substring(0,1) vale "a" (una stringa)
e non 'a' (un carattere)
• il metodo char charAt(int posizione) costituisce l’unico modo
per convertire una stringa composta da un solo carattere a un
carattere
Tipi riferimento e stringhe
25
Il metodo char charAt(int posizione)
Nell’invocare il metodo char charAt(int posizione) usando
come destinatario una stringa s
• il valore di posizione deve essere una posizione valida all’interno
della stringa s
– ovvero, deve valere posizione>=0 && posizione<s.length()
Nel caso in cui la pre-condizione dell’operazione charAt
non sia rispettata
• viene generato un errore al tempo di esecuzione, mediante una
eccezione di tipo IndexOutOfBoundsException
L’argomento posizione del metodo charAt viene
considerato un indice nell’accesso a un carattere della
stringa
• una posizione all’interno della stringa ―indica‖ il carattere che
occupa quella posizione
Tipi riferimento e stringhe
26
Concatenazione di stringhe
La concatenazione tra stringhe è una
operazione di uso frequente
• le stringhe possono essere concatenate usando l’operatore + di
concatenazione
• ad esempio, "auto" + "mobile" vale "automobile"
– l’espressione "auto" + "mobile" è essenzialmente equivalente a
"auto".concat("mobile")
• in questo caso, entrambi gli operandi dell’operatore di
concatenazione sono stringhe, e il risultato è una stringa
L’operatore di concatenazione tra stringhe che
è un operatore speciale per la manipolazione di
oggetti String
• in Java non sono definiti operatori speciali per nessun’altra
classe
Tipi riferimento e stringhe
27
Concatenazione e conversioni implicite
L’operatore + di concatenazione è anche in
grado di effettuare conversioni implicite da tipi
primitivi a stringhe
Ad esempio, se si vuole concatenare la stringa
"prezzo=" con la stringa che rappresenta l’intero
10.99
• è possibile scrivere l’espressione "prezzo=" + 10.99
– che vale "prezzo=10.99"
• l’espressione "prezzo=" + 10.99 è essenzialmente equivalente a
"prezzo=" + String.valueOf(10.99)
Tipi riferimento e stringhe
28
L’operatore + è sovraccarico
L’operatore + è sovraccarico
• è usato per l’operatore di somma tra numeri interi 10 + 20
• è usato per l’operatore di somma tra numeri razionali 10.0 + 20.0
• va ricordato che, quando si vuole sommare un intero con un
razionale, prima di effettuare la somma l’operando intero viene
convertito implicitamente a reale 10 + 20.0
L’operatore + è usato anche per l’operatore di
concatenazione tra stringhe — se almeno uno dei suoi
due operandi è una stringa
• quando si vuole concatenare una stringa con un numero, prima
di effettuare la concatenazione l’operando numerico viene
convertito implicitamente a stringa "prezzo=" + 10.99
Tipi riferimento e stringhe
29
Semantica dell’operatore +
Bisogna fare attenzione a comprendere il significato di
ogni occorrenza dell’operatore +, ricordando che
• l’operatore + è associativo a sinistra
• l’operatore + è sovraccarico, e ogni occorrenza di + deve essere
opportunamente interpretata (occorrenze diverse dell’operatore +
possono avere interpretazioni differenti)
Le possibili interpretazioni per l’operatore +
• somma intera — se entrambi gli operandi sono interi
• somma reale — se un operando è reale e l’altro è intero o reale
• concatenazione — se almeno un operando è una stringa
Ad esempio
"alfa" + 4 + "beta" vale "alfa4beta"
"alfa" + 4 + 5 vale "alfa45"
4 + 5 + "beta" vale "9beta" — e non "45beta"
Tipi riferimento e stringhe
30
Confronto tra stringhe
L’uguaglianza tra stringhe va verificata invocando il
metodo boolean equals(String t) della classe String
• ad esempio
String s, t, u, v;
s = "automobile";
t = "automobile";
u = "auto" + "mobile";
v = "auto".concat("mobile");
System.out.println(s.equals(t));
System.out.println(s.equals(u));
System.out.println(s.equals(v));
Tipi riferimento e stringhe
31
// true
// true
// true
Confronto tra stringhe
Attenzione
• l’operatore di uguaglianza == potrebbe non funzionare in modo
corretto
String s, t, u, v;
s = "automobile";
t = "automobile";
u = "auto" + "mobile";
v = "auto".concat("mobile");
System.out.println(s==t);
// true
System.out.println(s==u);
// true
System.out.println(s==v);
// false(!)
• l’operatore di uguaglianza == per i tipi riferimento serve a verificare
se due riferimenti referenziano uno stesso oggetto
• la gestione delle stringhe in Java presenta alcuni aspetti complicati
Tipi riferimento e stringhe
32
Uguaglianza tra stringhe
String a, b, c;
a = "automobile";
b = a;
// a==b && a.equals(b)
c = "auto".concat("mobile"); // a!=c && a.equals(c)
a
"automobile" : String
b
c
"automobile" : String
• possono esserci più variabili riferimento che referenziano uno
stesso oggetto
• possono esserci oggetti diversi che hanno lo stesso valore
– che rappresentano la stessa stringa
Tipi riferimento e stringhe
33
Riferimenti e uguaglianza
Gli operatori di uguaglianza (== e !=) possono
essere usati per verificare se due riferimenti sono
uguali
• siano a e b due variabili riferimento di uno stesso tipo
– a==b vale true se le variabili a e b referenziano lo stesso oggetto
– se a==b diciamo che a e b sono identici
– a!=b vale true se le variabili a e b referenziano oggetti diversi
In alcuni casi si vuole verificare se gli oggetti
referenziati da a e b sono uguali tra loro
• intuitivamente, due oggetti sono uguali se hanno lo stesso stato
• va in generale usato un metodo boolean equals(…)
– definito normalmente in tutte le classi
Tipi riferimento e stringhe
34
Confronto lessicografico tra stringhe
Come è possibile confrontare due stringhe per
stabilire in quale relazione d’ordine sono?
• il confronto tra stringhe è basato sull’ordinamento
lessicografico, simile (ma non identico!) a quello (alfabetico)
utilizzato nell’elencazione dei termini in un dizionario
• ad esempio, in un dizionario
alfa precede beta
albero precede alfa
alfa precede alfabeto
• non è possibile usare con i tipi riferimento gli operatori relazionali
< e <=
– questi operatori confronterebbero riferimenti a oggetti, il che non ha nessun
senso (ed è peraltro vietato)
Tipi riferimento e stringhe
35
Il metodo int compareTo(String x)
Per confrontare il valore di due stringhe e
stabilire in quale relazione d’ordine lessicografico
sono si deve utilizzare il metodo int
compareTo(String x) della classe String
• questo metodo confronta il valore di due stringhe, restituendo
– il valore 0 se le due stringhe sono uguali
– un valore negativo se la stringa su cui viene invocato il metodo precede la
stringa argomento — il valore assoluto del valore restituito non è significativo
– un valore positivo se la stringa su cui viene invocato il metodo segue la
stringa argomento — il valore assoluto del valore restituito non è significativo
• ad esempio
"alfa".compareTo("alfa") vale 0
"alfa".compareTo("beta") vale –1
"alfa".compareTo("alba") vale 4
"alfa".compareTo("alfabeto") vale –4
Tipi riferimento e stringhe
36
Il metodo int compareTo(String x)
Il metodo compareTo permette di verificare
l’ordinamento lessicografico, ma non quello
alfabetico (che è quello del dizionario)
"alfa".compareTo("Alfa") vale 32
– la 'A' precede la 'a'
"alfa".compareTo("Beta") vale 31
– tutte le maiuscole precedono tutte le minuscole
"uno".compareTo("1") vale 68
– le cifre precedono le lettere
"papa".compareTo("papà") vale –127
– le vocali accentate seguono tutte le altre lettere
Tipi riferimento e stringhe
37
Il letterale null
Il letterale null rappresenta convenzionalmente
un oggetto non creato
• null può essere assegnato a variabili di qualsiasi tipo riferimento
• null non referenzia nessun oggetto — rappresenta appunto un
riferimento non valido
Ad esempio
• una variabile che rappresenta il nome di una persona potrebbe
valere null
– per indicare che il nome della persona non è noto
• si parla di stringa nulla
– è diverso dalla stringa vuota
Tipi riferimento e stringhe
38
Invocazione di metodi e
NullPointerException
Non è possibile usare un riferimento null
nell’invocazione di un metodo
• viene generato un errore di tipo NullPointerException
• l’invocazione del metodo deve avvenire condizionatamente al
fatto che la variabile sia non nulla
if (x!=null)
... chiedi a x di fare qualcosa ...
Tipi riferimento e stringhe
39
Passaggio di parametri di tipo String:
oggetti non modificabili
Tutti gli oggetti della classe String sono immutabili e
quindi il loro valore non può essere modificato dopo che
sono stati creati.
La classe String non mette a disposizione alcun metodo
per modificare lo stato dell'oggetto.
Supponendo che alla variabile s di tipo String sia
assegnata una stringa, assegnare una nuova stringa alla
variabile s corrisponde a creare un nuovo oggetto e quindi
un nuovo riferimento che viene assegnato a s, senza
modificare la vecchia stringa.
La stringa puntata dal vecchio riferimento rimane in
memoria, ma non è più accessibile.
Tipi riferimento e stringhe
40
Passaggio di parametri di tipo String
Quali valori vengono stampati dalla seguente applicazione?
class LegameStringhe {
public static void alfa(String k) {
System.out.println(" dentro alfa = " + k);
/* crea un nuovo oggetto il riferimento al
precedente viene perso */
k = k.concat("giorno");
System.out.println(" dentro alfa = " + k);
}
public static void main(String[] args) {
String k = "buon";
System.out.println("prima di alfa = " + k);
alfa(k);
System.out.println("dopo alfa = " + k);
}
}
Tipi riferimento e stringhe
41
Esercizi
Data una stringa s, scrivere un metodo che conta e restituisce il
numero di cifre presenti in s. Scrivere l’applicazione relativa che:
legge la stringa, invoca il metodo e stampa il risultato.
Data una stringa s, scrivere un metodo che conta e restituisce il
numero dei soli caratteri alfabetici presenti in s. Scrivere
l’applicazione relativa che: legge la stringa, invoca il metodo e
stampa il risultato.
Data una stringa s scrivere un metodo che conta e restituisce il
numero di vocali maiuscole presenti in s. Scrivere l’applicazione
relativa che: legge la stringa, invoca il metodo e stampa il risultato.
Data una stringa s e un carattere car, scrivere un metodo che
restituisce la posizione di car in s, se esiste. Se car non esiste in s il
metodo deve restituire -1. Non usare il metodo indexOf. Scrivere
l’applicazione relativa che: legge la stringa, legge il carattere car,
invoca il metodo e stampa il risultato.
Tipi riferimento e stringhe
42
Riepilogo della dispensa
I tipi riferimento sono tipi definiti in corrispondenza a classi. Una
variabile riferimento permette di memorizzare il riferimento a un
oggetto, ma non il ―valore‖ di un oggetto – che è memorizzato in
un’altra area di memoria. Un riferimento non creato è individuato
dal letterale null.
Java supporta la gestione di stringhe attraverso la classe String; le
variabili di tipo String sono variabili riferimento;
stagione
"estate" : String
String
il valore (o contenuto) di un oggetto String è la stringa
rappresentata da quell’oggetto ed è immutabile: i metodi della
classe String operano creando nuovi oggetti di tipo String e quando
una stringa viene passata come parametro a un metodo il metodo
non ha modo di modificarla
Definizione di metodi
43
Riepilogo della dispensa
Le posizioni degli N caratteri di una stringa sono
numerate da sinistra verso destra
• il primo carattere ha posizione 0, l’ultimo ha posizione N-1
Alcuni metodi importanti della classe String:
int length()
String concat(String x)
String substring(int inizio, int fine), String substring(int inizio)
int indexOf(char car), int indexOf(String s)
String.valueOf - accetta come argomento il valore di un certo
tipo primitivo e restituisce un valore String
char charAt(int posizione)
boolean equals(String t)
int compareTo(String x)
Riferimenti al libro di testo
Per lo studio di questi argomenti si fa
riferimento al libro di testo, e in particolare al
Capitolo 12
Escluso il paragrafo 12.5.2 e il 12.8
Definizione di metodi
45