String s = "hello";
String backup_of_s = s;
s = "bye";
En este punto, la variable de copia de seguridad todavía contiene el valor original "hola" (esto se debe a la inmutabilidad de String, ¿verdad?).
Pero, ¿es realmente seguro copiar cadenas con este método (que por supuesto no es seguro copiar objetos mutables normales), o es mejor escribir esto? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
En otras palabras, ¿cuál es la diferencia (si la hay) entre estos dos fragmentos?
EDITAR: la razón por la cual el primer fragmento es seguro:
Permítanme explicar las cosas con un poco más de detalle, en función de las buenas respuestas ya proporcionadas (que se centraron esencialmente en la cuestión de la diferencia de rendimiento entre los 2 fragmentos):
Las cadenas son inmutables en Java, lo que significa que un objeto String no se puede modificar después de su construcción. Por lo tanto,
String s = "hello";
crea una nueva instancia de String y asigna su dirección a s
( s
siendo una referencia a la instancia / objeto)
String backup_of_s = s;
crea una nueva variable backup_of_s
y la inicializa para que haga referencia al objeto al que hace referencia actualmente s
.
Nota: la inmutabilidad de cadena garantiza que este objeto no se modificará: nuestra copia de seguridad es segura
Nota 2: el mecanismo de recolección de basura de Java garantiza que este objeto no se destruirá siempre y cuando se haga referencia al menos a una variable ( backup_of_s
en este caso)
Finalmente, s = "bye";
crea otra instancia de String (debido a la inmutabilidad, es la única forma) y modifica la s
variable para que ahora haga referencia al nuevo objeto.
s
para referirse a un objeto diferente (elString
"adiós"). Eso no afecta a lo que se refiere la variable debackup_of_s
referencia (elString
"hola"). Como dije, podría proporcionar un ejemplo equivalente conStringBuilder
s, que no son inmutables. Mi comentario se refiere principalmente a la declaración de OP: en este punto, la variable de copia de seguridad todavía contiene el valor original "hola" (esto se debe a la inmutabilidad de String, ¿verdad?).Las cadenas son objetos inmutables, por lo que puede copiarlas simplemente haciendo referencia a la referencia a ellas, porque el objeto al que se hace referencia no puede cambiar ...
Entonces puede copiar como en su primer ejemplo sin ningún problema:
fuente
Su segunda versión es menos eficiente porque crea un objeto de cadena adicional cuando simplemente no hay necesidad de hacerlo.
La inmutabilidad significa que su primera versión se comporta de la manera esperada y, por lo tanto, es el enfoque preferido.
fuente
El segundo caso también es ineficiente en términos del conjunto de cadenas, debe llamar explícitamente a intern () en la referencia de retorno para hacerlo interno.
fuente
¿Qué tal una copia como esta? Creo que obtener una nueva copia es mejor, para que los datos de
str1
no se vean afectados cuandostr2
se haga referencia y se modifique en otra acción.fuente
String
Es inmutable. clonar cadenas no tiene mucho sentido.