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