str
no es un objeto, es una referencia a un objeto. "Hello"
y "Help!"
son dos String
objetos distintos . Por lo tanto, str
apunta a una cadena. Puede cambiar lo que apunta , pero no lo que apunta .
Tome este código, por ejemplo:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Ahora, no hay nada 1 que podríamos hacer para s1
que afectaría el valor de s2
. Se refieren al mismo objeto, la cadena "Hello"
, pero ese objeto es inmutable y, por lo tanto, no se puede modificar.
Si hacemos algo como esto:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Aquí vemos la diferencia entre mutar un objeto y cambiar una referencia. s2
todavía apunta al mismo objeto que inicialmente configuramos s1
para apuntar. Ajuste s1
a "Help!"
sólo cambia la referencia , mientras que el String
objeto al que se refería originalmente a los restos sin cambios.
Si las cadenas fueran mutables, podríamos hacer algo como esto:
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"
Editar para responder a la edición de OP:
Si mira el código fuente de String.replace (char, char) (también disponible en src.zip en su directorio de instalación de JDK, un consejo profesional es buscar allí cada vez que se pregunte cómo funciona realmente algo), puede ver que lo que hace es lo siguiente:
- Si hay una o más ocurrencias de
oldChar
en la cadena actual, haga una copia de la cadena actual donde oldChar
se reemplazan todas las ocurrencias de newChar
.
- Si
oldChar
no está presente en la cadena actual, devuelva la cadena actual.
Entonces sí, "Mississippi".replace('i', '!')
crea un nuevo String
objeto. De nuevo, lo siguiente es válido:
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
Su tarea por ahora es ver qué hace el código anterior si cambia s1 = s1.replace('i', '!');
a s1 = s1.replace('Q', '!');
:)
1 En realidad, es posible mutar cadenas (y otros objetos inmutables). Requiere reflexión y es muy, muy peligroso y nunca debe usarse a menos que esté realmente interesado en destruir el programa.