Tipo String String è una classe predefinita I valori di tipo String sono oggetti quindi sono memorizzati nello heap ma NON sono modificabili operazioni sono:charAt, +, length, equals, compareTo e molte altre (librerie) “abcd”, “”, null sono valori new String(“abcd”), altri costruttori
String e char [] Rappresentano gli stessi valori. Conversione: public String (char [] value) costruisce un valore di tipo String contenente i caratteri dell’array value. public char [] toCharArray() restituisce una array di caratteri contenente la sequenza di caratteri contenuta in this Selezione: a[i] seleziona il carattere i-esimo nell’array a s.charAt(i) seleziona il carattere i-esimo nella stringa s Gli array sono modificabili mentre le stringhe no.
Esempio di condivisione Stack Heap int i=6; String []a={‘a’,’b’,’c’}; String []b={‘c’,’d’}; String s=“abcd”; int j; String t=s; i 6 [‘a’,’b’,’c’] a b [‘c’,’d’] s j t “abcd” Stack Heap j=i; i++; b=a; a[1]=‘f’; s=s+”g”; i 7 [‘a’,’f’,’c’] a b [‘c’,’d’] s j 6 “abcd” t “abcdg”
Ancora sulle stringhe Il metodo di istanza equals si comporta in modo diverso da ==: String s=“abcd”; String t=“ab”+”cd” s==t calcola false mentre s.equals(t) calcola true
Esempio Heap String []a={‘a’,’b’}; String []b={‘a’,’b’}; ... a.equals(b) => false (confronta gli indirizzi) ... a==b => false (confronta gli indirizzi) String s=“abcd”; String t=“ab”+”cd”; s.equals(t) => true (confronta i valori) s==t => false (confronta gli indirizzi) Stack [‘a’,’b’] a b [‘a’,’b’] s t “abcd” “abcd” Stack Heap [‘a’,’b’] a b [‘a’,’b’] s a=b; ... a.equals(b) => true (confronta gli indirizzi) ... a==b => true (confronta gli indirizzi) t “abcd” “abcd”
Modifica dei valori degli oggetti Gli oggetti possono essere modificati, se ci sono operazioni che lo consentono. Ad esempio gli elementi degli array. E` importante capire quando si verifica la condivisione, proprio nel caso di oggetti modificabili.