2010-08-03 13 views
6
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?

+1

Sería correcto si solo 's.substring (1)' cambiara la cadena en 's'. Pero estás asignando una nueva cadena a 's'. –

+1

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

+6

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

Respuesta

23

Los objetos de cadena son inmutables. Las cadenas referencias, sin embargo, son mutables. Más arriba, s es una referencia.

+1

+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

+3

Dang, ojalá hubiera visto esta Q antes que tú para conseguir un montón de representante fácil. :) +1 – iandisme

2

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ó.

+0

Basura recogida? –

4

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.

4

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 substringdevolverá 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!"

0

Así:

String foo = "foo"; 
foo.substring(1); 
System.out.println(foo); 

//of course.. 
foo = "aa"; 
System.out.println(foo); 
0

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.

0

prueba que:

String s = "Test"; 
String j = s; 

s = s.substring(1); 

s es ahora T y j sigue siendo Test.

2

// 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.

Cuestiones relacionadas