Classe String
Cosâè
- Eâ un package che non richiede import
- Eâ una classe fondamentale perchĂŠ è relativo al un tipo di dato i cui letterali sono parte della sintassi del linguaggio e per il quale il significato dellâoperatore â+â è ridefinito
- Non serve chiamare il costruttore per inizializzare una stringa
Ottenere la lunghezza della stringa
- La classe String è dotata del metodo
lenght()
String s="ciao";
System.out.println(s.lenght());
- Stamperà il valore 4, che è pari al numero di caratteri di cui è composta la sringa
Stringa tutta in maiuscolo o in minuscolo
- Con i metodi
toLowerCase()
etoUpperCase()
si ottiene unâaltra stringa tutta in maiuscolo o minuscolo - La stringa su chi viene invocato il metodo non viene modificata
String min="Ciao".toLowerCase(); //"ciao"
String max="Ciao".toUpperCase(); //"CIAO"
String ariMin= max.toLowerCase(); //"ciao", max è la variabile usata in precedenza
Ottenere i singoli caratteri
Eâ possibile ottenere il k-esimo carattere di una stringa con il metodo charAt
Importante
- Il primo carattere è in posizione 0
- lâultimo carattere è in posizione
stringa.lenght()-1
String.out.println(s.charAt(2)); //stmpa il carattere "a"
Ottenere una sottotringa
Eâ possibile ottenere una sottostringa di una stringa con il metodo substing(startIndex, endIndex)
Info
- startIndex è lâindice di partenza della sottostringa
- endIndex è lâindice successivo allâultimo carattere della sottostringa
String s = âciaoâ;
System.out.println(s.substring(1, 3)); //stmpa "ia"
Concatenare le stringhe
- La concatenazione tra due stringhe può essere effettuata con lâoperatore âspecialeâ + oppure mediante il metodo
concat(s)
String s3 = s1+s2;
String s4 = s1.concat(s2);
- Tuttavia, se si devono concatenare parecchie stringhe, è bene utilizzare la classe StringBuilder, dotata dei metodi
append(String s)
einsert(int posizione, String s)
StringBuilder sb = new StringBuilder();
sb.append(s1).append(s2);
String s5 = sb.toString();
Cercare una stringa
- Si può cercare la (prima) posizione di un carattere c con
indexOf(c)
- restituisce -1 se il carattere non è presente
- Eâ possibile anche cercare la prima posizione di una sottostringa con
indexOf(s)
sove s è di tipo String
int k = âhappy happy birthdayâ.indexOf(âaâ);
int j = âdin din don donâ.indexOf(âdonâ);
int h = âabcdâ.indexOf(âeâ);
- k varrĂ 1, j varrĂ 8 e h varrĂ -1
- Con i metodi
startsWith
eendsWith
è possibile verificare prefissi o suffissi della stringa
Sostituire caratteri e sottostringhe
- Con il metodo replace è possibile sostituire tutte le occorrenze di un carattere o di una stringa allâinterno di una stringa
// s1 vale âuno due treâ
String s1 = âuno_due_treâ.replace(â_â, â â);
// s2 vale âuno two treâ
String s2 = âuno due treâ.replace(âdueâ, âtwoâ);
// s3 vale âaano daae treâ
String s3 = âuno due treâ.replace(âuâ, âaaâ);
Confrontare stringhe
Tutti gli oggetti vanno SEMPRE confrontati con il metodo equals()
Differenza tra equals e ==
-
Lâoperatore
==
confronta il riferimento (diciamo, lâindirizzo in memoria), quindi è true se e solo se si confrontano gli stessi oggetti fisici -
Lâoperatore
equals
confronta la stringa carattere per carattere e restituisce true se le stringhe contengono la stessa sequenza di caratteri
String s1 = âciaoâ, s2 = âciâ+âaoâ, s3 = âhelloâ;
System.out.println(s1 == s2); // potrebbe restituire false
System.out.println(s1.equals(s2)); // restituisce true
System.out.println(s1.equals(s3)); // restituisce false
Spezzare le stringhe
- Il metodo
split()
prende in input unâespressone regolare s (senza entrare in dettagli, è sufficiente pensarla come una semplice stringa) e restituisce un array di sottostringhe separate da s
String[] parole = "uno due tre".split(" ");
// parole contiende l'array new String[] { "uno", "due", "tre"}
Valori primitivi e oggetti
-
Eâ importante tenere a mente la differenza tra
- Valori di tipo primitivo (int, char, booleani, float, double)
- Oggetti (istanze delle classi)
-
La loro rappresentazione in memoria è differente:
- Valori primitivi: memoria allocata automaticamente a tempo di compilazione
- Oggetti: memoria allocata durante lâesecuzione del programma (operatore new)
Inizializzazione implicite per i campi della classe
- Al momento della creazione dellâoggetto i campi di una classe sono inizializzati automaticamente
Attenzione
Le inizializzazioni sono automatiche per i campi di una classe, ma NON per le variabili locali dei metodi
Notazioni letterali
- Si può dichiarare un intero in decimale
int val = 42;
- Un intero in esadecimale
int val = 0x2A
- Un intero in bianario
int val = 0b101010;
- Il valore di quei 4 byte sarĂ sempre lo stesso: 42
Esempio
public class Room
{
private int numberOfPeople;
private Counter acessCounter;
public static void main (String[] args)
{
int n;
Counter myCounter;
System.out.println (n+ ", "+ myCounter);
Room room = new Room(); //Crea un nuovo oggetto in memoria contenente i campi numberOfPeople e accessCounter inizializzati
System.out.println (room.numerOfPeople); //stampa 0
System.out.println (room.acessCounter); //stmpa Null
}
}
Riferimenti e oggetti
- i riferimenti sono ciò che ne è rimasto in Java
- Un riferimento è un indirizzo di memoria
- Tuttavia non conosciamo il valore numerico dellâindirizzo
- Quindi gli oggetti non sono mai memorizzati direttamente nelle variabili, ma solo mediante il loro riferimento
Variabili di tipi primitivi e variabili âriferimentoâ
- Le variabili contengono:
- valori di tipi di dati primitivi
- oppure riferimenti a oggetti
Oggetti: i tre passi della dichiarazione, creazione e assegnazione
Dichiarazione
Menu menu = new Menu()
(Menu menu)
Creazione
Menu menu = new Menu()
(new Menu())
Assegnazione:
Menu menu = new Menu()
(=)
Anatomia della memoria
Esistono due tipo di memoria: lo heap e lo stack
- Sullo stack vanno variabili locali
- Sullo heap vanno le aree di memoria allocate per la creazione dinamica
Campi di classe: la parola chiave static
- I campi di una classe possono essere dichiarati static
- Un campo static è relativo allâintera classe, non al singolo oggetto istanziato
- Un campo static esiste in una sola istanza di memoria, allocata prima di qualsiasi oggetto della classe in una zona speciale di memoria nativa chiamata MetaSpace
- Viceversa, per ogni campo non static esiste una locazione di memoria per ogni oggetto, allocata a seguito dellâinstrzuione new
public class Tornello
{
static private int passaggi;
public void passa() {passaggi++;}
public static int getPassaggi() { return passaggi;}
public static void main (String[] args)
{
Tornello t1 = new Tornello();
t1.passa();
Tornello t2 = new Tornello();
for (int k=0; k<10; k++) t2.passa();
int g;
String s=null;
//fotografa lo stato della memoria
}
}