2012-05-19 10 views
6

Ok, esta pregunta es una extensión de esta pregunta¿No debería hacer `String s = new String (" una nueva cadena ");` en Java, incluso con el interrogatorio automático de cadenas?

Java Strings: "String s = new String("silly");"

La pregunta anterior la misma pregunta como ésta, pero tengo un nuevo punto de dudar.

Según Effective Java y las respuestas de la pregunta anterior, debemos hacer noString s = new String("a new string");, porque eso va a crear el objeto innecesario.

No estoy seguro acerca de esta conclusión, porque creo que Java está haciendo automatic string interning, lo que significa que para una cadena, de todos modos solo hay una copia de la misma en la memoria.

Veamos String s = new String("a new string");.

"a new string" ya es una cadena que se ha creado en la memoria.

Cuando hago String s = new String("a new string");, entonces el s también es "a new string". Por lo tanto, de acuerdo con automatic string interning, s debe apuntar a la misma dirección de memoria de "a new string", ¿verdad?

Entonces, ¿cómo podemos decir que creamos objetos innecesarios?

+9

There * is * solo una copia de String * a menos que haga 'new String (...)' *. No lo hagas a menos que tengas que hacerlo. –

+0

+1 por pregunta interesante, nunca pensé en ello. Sin embargo, la mayor parte del tiempo puede verificar esto examinando las diferencias (o la falta de diferencias) en bytecode entre las 2 versiones. –

+6

'intern'ing solo se ejecuta automáticamente en los literales' String'. – Jeffrey

Respuesta

16

String a = "foo"; // this string will be interned 
String b = "foo"; // interned to the same string as a 
boolean c = a == b; //this will be true 
String d = new String(a); // this creates a new non-interned String 
boolean e = a == d; // this will be false 
String f = "f"; 
String g = "oo"; 
String h = f + g; //this creates a new non-interned string 
boolean i = h == a // this will be false 
File fi = ...; 
BufferedReader br = ...; 
String j = br.readLine(); 
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned 
+0

Buena respuesta. Muy simple – keyser

0

usando "=" en lugar de "= new String" es mejor, ya que podría dar como resultado una única instancia en lugar de varias instancias.

2

Le recomendamos leer más acerca de String literal pool en JVMs. Google rápido me señaló este artículo: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 que parece bastante válido.

También puede interesarle la agrupación de literales enteros, así como la agrupación de otros literales en Java.

Cuestiones relacionadas