str
non è un oggetto, è un riferimento a un oggetto. "Hello"
e "Help!"
sono due String
oggetti distinti . Pertanto, str
punta a una stringa. Puoi cambiare ciò a cui punta , ma non ciò a cui punta .
Prendi questo codice, ad esempio:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Ora, non c'è niente di 1 potremmo fare per s1
questo sarebbe influenzare il valore di s2
. Si riferiscono allo stesso oggetto - la stringa "Hello"
- ma quell'oggetto è immutabile e quindi non può essere modificato.
Se facciamo qualcosa del genere:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Qui vediamo la differenza tra la mutazione di un oggetto e la modifica di un riferimento. s2
punta ancora allo stesso oggetto su cui inizialmente abbiamo s1
puntato. Impostazione s1
di "Help!"
cambia solo il riferimento , mentre l' String
oggetto originariamente cui rimane invariato.
Se le stringhe fossero mutabili, potremmo fare qualcosa del genere:
String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"
Modifica per rispondere alla modifica dell'OP:
Se guardi il codice sorgente di String.replace (char, char) (disponibile anche in src.zip nella directory di installazione di JDK - un suggerimento professionale è quello di guardare lì ogni volta che ti chiedi come funziona davvero qualcosa) puoi vedere che cosa lo fa è il seguente:
- Se
oldChar
nella stringa corrente sono presenti una o più occorrenze , crea una copia della stringa corrente in cui tutte le occorrenze di oldChar
vengono sostituite newChar
.
- Se
oldChar
non è presente nella stringa corrente, restituisce la stringa corrente.
Quindi sì, "Mississippi".replace('i', '!')
crea un nuovo String
oggetto. Ancora una volta, vale quanto segue:
String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects
I compiti per ora sono vedere cosa fa il codice sopra se cambi s1 = s1.replace('i', '!');
in s1 = s1.replace('Q', '!');
:)
1 In realtà, è possibile mutare stringhe (e altri oggetti immutabili). Richiede riflessione ed è molto, molto pericoloso e non dovrebbe mai essere usato a meno che non sia effettivamente interessato a distruggere il programma.