2010-09-07 9 views
8

Uso el == en el código siguiente e imprimo "¡Igual!", ¿Por qué? ¿Alguien puede explicar por qué estas dos cadenas diferentes a y b son iguales?Comprobación de instancias iguales de 2 diferentes (ejemplo incluido)

public class test 
{ 
    public static void main() 
    { 
     String a = "boy"; 
     String b = "boy"; 

     if(a == b) 
     { 
      System.out.println("Equals!"); 
     } 
     else 
     { 
      System.out.println("Does not equal!"); 
     } 
    } 
} 

Respuesta

10

Esto se debe a String interna.

Java (The JVM) mantiene una colección de literales String que se utiliza para ahorrar memoria. Por lo tanto, cada vez que se crea un String, así:

String s = "String"; 

Java 'internos' de la cadena. Sin embargo, si crea la String así:

String s = new String("String"); 

Java no lo hará automáticamente el pasante String. Si creó sus cadenas de esta manera, su código produciría resultados diferentes.

A quick Google search revela muchos buenos recursos con respecto a String interning.

2

este artículo se explicará en detalles:

What is the difference between == and equals() in Java?

Después de la ejecución de una cadena = “niño”; la JVM agrega el cadena "chico" al grupo y en la siguiente línea del código, encuentra String b = "boy" otra vez; en este caso, la JVM ya es sabe que esta cadena ya está en el grupo , por lo que no crea una nueva cadena . Entonces ambas cadenas a y b apuntan a la misma cadena lo que significa que apuntan a la misma referencia.

+0

== compara referencias de objetos en Java y no en contenido. – AbdullahC

+0

Hipopótamo: pasé por alto este. Solo corrigí mi error con una buena referencia. –

+0

ok, simplemente cancela mi voto hacia abajo – vodkhang

1

Debido a que el tiempo de ejecución tendrá un grupo de cadena y cuando es necesario asignar una nueva cadena constante, el aspecto tiempo de ejecución dentro de la piscina, si la piscina lo contiene, entonces establecer el punto variable a la misma cadena objeto dentro de la piscina.

Pero nunca debe depender de esto para comprobar que la cadena de contenido sea igual. Debe utilizar el método: equals

2

String a = "boy"; creará un nuevo objeto de cadena con valor ("chico"), colóquelo en el grupo de cadenas y haga que a se refiera a él.

Cuando el intérprete ve String b = "boy";, se comprueba primero para ver si string"boy" está presente en el grupo de cadena, ya que está presente, no se crea un nuevo objeto y b se hace referencia al mismo objeto que a se refiere a .

Dado que ambas referencias contienen el mismo contenido, pasan la prueba de igualdad.

0

Como se explicó correctamente anteriormente, en el caso de la comparación '==', el tiempo de ejecución buscará en el grupo String la existencia de la cadena. Sin embargo, es muy posible que durante la recolección de basura, o durante problemas de memoria, la máquina virtual pueda destruir el grupo de cadenas.El operador "==" correspondiente puede o no devolver el valor correcto.

Lección - Use siempre equals() para comparar.

+1

Esto, en mi opinión, es una de las grandes debilidades del lenguaje Java. Deberían haberlo hecho para que los operadores == y! = Trabajen con cadenas de la forma en que la gente normal espera que lo hagan. –

+0

No, el tiempo de ejecución * * no se verá en el grupo de cadenas cuando aplique el operador '=='. '==' es solo una comparación de puntero. – finnw

0

Cada vez que creamos una cadena como a continuación:

String str1 = "abc"; 
String str2 = "abc"; 

JVM se compruebe la str2 = "abc" en la piscina constante de cadena, si está presente, entonces no lo puedo crear una nueva cadena en lugar que apunte a la cadena de la una de la grupo de constante de cadena

Pero en el caso de esto String str = new String("abc"); siempre creará un nuevo objeto String pero podemos usar la función intern() para forzar a JVM a buscar en el grupo de constante de cadena.

Cuestiones relacionadas