strno es un objeto, es una referencia a un objeto. "Hello"y "Help!"son dos Stringobjetos 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 s1que 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. s2todavía apunta al mismo objeto que inicialmente configuramos s1para apuntar. Ajuste s1a "Help!"sólo cambia la referencia , mientras que el Stringobjeto 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
oldCharen la cadena actual, haga una copia de la cadena actual donde oldCharse reemplazan todas las ocurrencias de newChar.
- Si
oldCharno está presente en la cadena actual, devuelva la cadena actual.
Entonces sí, "Mississippi".replace('i', '!')crea un nuevo Stringobjeto. 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.