2012-09-05 8 views
5

Duplicar posibles:
intern() behaving differently in Java 6 and Java 7String.intern() Referencia del cambio de cadena JDK7 original

Mientras que hace ejemplo para this question

noté un comportamiento extraño de intern() método cuando llamo al intern() método en String a partir de entonces puedo usar == operador f o el Original String.

JavaDoc de intern() método:

Devuelve una representación canónica para el objeto de cadena. Un conjunto de cadenas, inicialmente vacío, se mantiene en privado por la clase String.

Cuando se invoca el método interno, si el grupo ya contiene una cadena igual a este objeto String según lo determinado por el método equals(Object), se devuelve la cadena del grupo. De lo contrario, este objeto String se agrega al grupo y se devuelve una referencia a este objeto String.

ello se deduce que para cualquier par de cadenas s y t, s.intern() == t.intern() es cierto si y sólo si es verdad s.equals(t).

Por encima de Javadoc no dice que la cadena original se cambia. Entonces, ¿por qué este programa imprime okay cuando test es la entrada.

import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     Scanner user_input = new Scanner(System.in); 
     String username; 
     System.out.print("username: "); 
     username = user_input.next(); 
     // Even if I do not assign returned string for comparison still it compares 
     // okay else it does not compare 
     username.intern(); 
     if (username == "test") { 
      System.out.println("okay"); 
     } 
     else { 
      System.out.println("not okay"); 
     } 
    } 
} 
+1

La llamada 'intern()' * no debe * poder influir en el resultado de la prueba a continuación. –

+1

@JoachimSauer curiosamente lo hace. Acabo de probarlo con el último Java7. –

+0

Intentó con java 6 e imprime "no está bien". – dcernahoschi

Respuesta

3

String.intern() devuelve la cadena ed pasante(). Esto se debe a que un método no puede cambiar una referencia que se le pasa.

Entonces, ¿por qué este programa se imprime bien cuando la prueba es la entrada.

Imprime bien porque la cadena ed pasante() es la primera vez que esta cadena se ve por lo que se convierte en la cadena literal para "prueba". No es la Cadena la que cambia, sino el objeto que se usa para "probar" que se cambia.

Intente en su lugar.

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

En este caso, la salida en Java 7 actualización 7 es

String object the same is: test 

pero ejecutar esto en Java 6 Update 32 o elimine la línea de modo "test" es visto por primera vez y se obtiene.

String object the same is: false 
+0

Pero está cambiando la referencia de cadena original. Estoy usando JDK7. –

+1

Lo que estás sugiriendo es imposible en Java para cualquier método, así que no, no lo es. –

+0

@AmitD Se agregó un ejemplo para demostrar la diferencia. Es el literal String el que se cambia, no la cadena 'username'. –

2

str.intern() comprueba si ya hay el mismo objeto en String Pool y, de ser así, lo vuelve a utilizar.

+1

Eso es correcto, sin embargo, la referencia devuelta debe ser la cadena agrupada. No debería cambiar la referencia desde dentro del método. –

0

Debajo de la línea, ingrese el usuario del formulario de entrada.

username = user_input.next(); 

Después de que está llamando username.intern(); que devuelve la cadena literal de username
En su sentencia de condición

if (username == "test") 

la variable de username contengan la cadena literal de objeto de grupo de cadena y "test" es también una Cadena literal así que jvm le dará la misma referencia de String test que ya está creada para username que significa username y "test" son el mismo objeto. Y en java == operado referencia cheque para el objeto por lo que en este caso se devolverá true es por eso que sus impresiones okay

Cuestiones relacionadas