2012-09-05 15 views
15

Duplicar posible:
intern() behaving differently in Java 6 and Java 7cadena pasante rompecabezas

En esta blog me pareció interesante rompecabezas de Cuerda:

--- --- Cita

String te = "te", st = "st"; 
//"test".length(); 
String username = te + st; 
username.intern(); 
System.out.println("String object the same is: " 
    + (username == "test")); 

grabados bajo Java 7 actualización 7.

String object the same is: true

pero quite el comentario .length "prueba"(); línea, o correr con Java 6 y se imprime

String object the same is: false

--- --- EOQ

Siendo honesto, no entiendo por qué los resultados son diferentes. ¿Podría explicarme cuál es la causa de tal comportamiento?

+2

bien, es 'falso' en ambos casos –

+0

sí @Jigar tiene razón, cuando probé su código, la salida es falsa siempre –

+2

Falso o no difiere con la versión de Java. –

Respuesta

14

Es necesario asignar la cadena internado de nuevo a nombre de usuario:

String username = te + st; 
username = username.intern(); 

En cuyo caso ambos códigos es la salida true.

Aquí es otro ejemplo interesante:

final String te = "te", st = "st"; 
"test".length(); 
String username = (te + st); 
System.out.println("String object the same is: " + (username == "test")); 

impresiones cierto también, porque te y st están marcados como final. Por lo tanto, el nombre de usuario se convierte en una constante de tiempo de compilación y se interna automáticamente.

EDITAR

Como varias personas señalaron sus impresiones de códigos falsos con Java 6, incluso cuando la línea "test".length está comentada.

Esto es debido a one of the changes introduced in Java 7:

en JDK 7, internados cadenas ya no se asignan en la generación permanente de la pila de Java, sino que se asignaron en la parte principal de la pila de Java (conocido como las generaciones jóvenes y viejas), junto con otros objetos creados por la aplicación.

Una consecuencia es que the code you posted has different outputs in Java 6 and 7 (vea el ejemplo en la parte inferior del informe de errores).

5

Por favor marque la respuesta de Does String.intern() change reference of Original String

No es la cadena que se cambia, pero el objeto que se utiliza para la "prueba" que se cambia.

Así, en su caso si "test" se define primero lo que significa si lo hace primero "test".length(); continuación "test" está en grupo de cadena de modo primer resultado es false.

ahora if you comment this line continuación, después de llamar username.intern(); "prueba" se agrega al grupo de cadena ahora el siguiente "test" la que está utilizando para la comparación consigue asignaron mismo objeto que se puso por username.intern(); método. Por lo tanto es true

por lo

Commented //"test".length(); -> True 
Un Commented "test".length(); --> False