String s = "hello";
String backup_of_s = s;
s = "bye";
A questo punto, la variabile di backup contiene ancora il valore originale "ciao" (questo a causa dell'immutabilità di String, giusto?).
Ma è davvero sicuro copiare le stringhe con questo metodo (che ovviamente non è sicuro copiare normali oggetti mutabili), o è meglio scriverlo? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
In altre parole, qual è la differenza (se presente) tra questi due frammenti?
EDIT: il motivo per cui il primo frammento è sicuro:
Vorrei solo spiegare le cose con un po 'più di dettaglio, basato sulle buone risposte già fornite (che erano essenzialmente incentrate sulla questione della differenza di prestazioni tra i 2 frammenti):
Le stringhe sono immutabili in Java, il che significa che un oggetto String non può essere modificato dopo la sua costruzione. Quindi,
String s = "hello";crea una nuova istanza String e assegna il suo indirizzo a s( sessendo un riferimento all'istanza / oggetto)
String backup_of_s = s;crea una nuova variabile backup_of_se la inizializza in modo che faccia riferimento all'oggetto a cui fa attualmente riferimento s.
Nota: l'immutabilità delle stringhe garantisce che questo oggetto non verrà modificato: il nostro backup è sicuro
Nota 2: il meccanismo di garbage collection di Java garantisce che questo oggetto non verrà distrutto fintanto che viene indicato da almeno una variabile ( backup_of_sin questo caso)
Infine, s = "bye";crea un'altra istanza String (a causa dell'immutabilità, è l'unico modo) e modifica la svariabile in modo che ora faccia riferimento al nuovo oggetto.