strnon è un oggetto, è un riferimento a un oggetto. "Hello"e "Help!"sono due Stringoggetti 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 s1questo 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. s2punta ancora allo stesso oggetto su cui inizialmente abbiamo s1puntato. Impostazione s1di "Help!"cambia solo il riferimento , mentre l' Stringoggetto 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
oldCharnella stringa corrente sono presenti una o più occorrenze , crea una copia della stringa corrente in cui tutte le occorrenze di oldCharvengono sostituite newChar.
- Se
oldCharnon è presente nella stringa corrente, restituisce la stringa corrente.
Quindi sì, "Mississippi".replace('i', '!')crea un nuovo Stringoggetto. 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.