String s = ...;
s = s.substring(1);
¿Esto es posible? Pensé que no puedes cambiar un objeto String en Java.¿No son inmutables los objetos String en Java?
String s = ...;
s = s.substring(1);
¿Esto es posible? Pensé que no puedes cambiar un objeto String en Java.¿No son inmutables los objetos String en Java?
Los objetos de cadena son inmutables. Las cadenas referencias, sin embargo, son mutables. Más arriba, s
es una referencia.
+1 corto y correcto. El valor inicial de s sigue ahí, sin cambios y posiblemente sin referencia, en la memoria, a la espera de obtener GC. Sin embargo, la referencia ahora apunta a un objeto nuevo, igualmente inmutable, creado por el método de subcadena. – delnan
Dang, ojalá hubiera visto esta Q antes que tú para conseguir un montón de representante fácil. :) +1 – iandisme
Aquí está creando una nueva cadena y asignándola a una referencia pre-utilizada. La cadena original a la que se hace referencia es basura recolectada. Sin cadenas realmente cambió.
Basura recogida? –
Los objetos de cadena son inmutables, lo que significa que el valor de la instancia mencionada en s
no se puede cambiar.
Su código no muta la instancia.
Más bien, cambia la referencia s
para hacer referencia a una nueva instancia de cadena.
Por ejemplo:
String a = "1";
String b = a;
a = "2";
Después de ejecutar este código, b
sigue siendo "1"
.
La línea b = a
establece b
para hacer referencia a la misma instancia "1"
a la que hace referencia actualmente a
.
Cuando escribe posteriormente a = "2"
, está cambiando la variable a
para hacer referencia a una instancia diferente ("2"
).
Sin embargo, la instancia original "1"
, a la que se refiere b
, no ha cambiado.
Sí, String
objetos son inmutables.
La variable s
es una referencia a un objeto, y la referencia en sí puede tener el objeto al que apunta a cambiar: la reasignación de la referencia no afecta al objeto al que apunta.
El método String.substring
está devolviendo una nueva instancia de String
, por lo que el objeto original String
no se modifica.
El siguiente es un ejemplo sencillo para demostrar que el original String
no se altera por el método substring
::
String s = "Hello!";
s.substring(1);
System.out.println(s); // Prints "Hello!"
El ejemplo anterior imprimir "Hola!" porque el método substring
devolverá un nuevo String
en lugar de afectar al original. El original String
no se puede modificar porque es inmutable.
comparar la anterior con la siguiente:
String s = "Hello!";
s = s.substring(1);
System.out.println(s); // Prints "ello!"
En este ejemplo, la referencia a s
se cambia al String
devuelto por el método substring
, así que cuando la String
asociado con s
es impreso por `Sistema. out.println ", la cadena de salida será" ello!"
Así:
String foo = "foo";
foo.substring(1);
System.out.println(foo);
//of course..
foo = "aa";
System.out.println(foo);
Cuando se utiliza la cadena s = "abc", se crea una cadena de referencia a un objeto String que tiene el valor inmutable "abc"
Entonces, cuando usted. diga s = s.substring (1) ;, asigna s a un objeto String creado recientemente que contiene "bc" - pero el objeto original no ha cambiado.
Esta es una causa común de errores, porque si no lo hizo asignar el valor, puede obtener resultados inesperados.
Muchos desarrolladores Java principiantes usarán métodos como trim(), sin darse cuenta de que trim() no afecta a String.
s.trim() < - No sirve para nada, devuelve una cadena recortada - esto es un error.
s = s.trim() < - Almacena la cadena recortada - esto es correcto.
prueba que:
String s = "Test";
String j = s;
s = s.substring(1);
s
es ahora T
y j
sigue siendo Test
.
// Crear una referencia a s cadena "Hola"
cadena s = "Hola";
// Ahora subCadena de impresión de cadena de referidos por s
System.out.println (s.subString (1));
// Ahora Imprimir Cadena referido por s
System.out.println (s);
El fragmento de código anterior sería primera impresión H y luego en segunda línea se imprimirá Hola. Ahora ¿Por qué imprimió primero H? : Thing es subString() método devuelve una Cadena * sin cambiar la cadena referida por la referencia s *. s todavía se está refiriendo a "Hola". Ahora, cuando intente imprimir s, imprimirá la cadena a la que se refiere s. de esta manera, la cadena "Hola" es inmutable. solo puede usarlo para producir otra cuerda pero no puede mutarla.
Cuando use la declaración s = s.subString (1); Lo que está haciendo es que s se está refiriendo ahora a un subString() de "Hola", pero "Hola" en sí mismo todavía no se modifica.
Sería correcto si solo 's.substring (1)' cambiara la cadena en 's'. Pero estás asignando una nueva cadena a 's'. –
Solo está cambiando la referencia s, no la cadena original.Un punto de estilo menor: a menudo es mejor crear una nueva variable local con un nombre descriptivo en lugar de volver a usar variables como esta. – mikera
No confunda los objetos con las referencias. Los objetos pueden ser mutables o inmutables. Las referencias pueden ser "finales" o no. Hacer una referencia 'final' no hace que el objeto sea inmutable. Los objetos inmutables pueden ser referidos por referencias que no tienen que ser 'finales'. – polygenelubricants