2012-02-09 22 views
5

Observé un extraño comportamiento == operador en java. Estoy tratando de imprimir la salida puesto de la siguiente maneracomportamiento extraño de == en Java

String str1 = "Rajesh"; 
String str2 = "Rajesh"; 
System.out.println("Using equals() str1 and str2 Equals :" 
      + str1.equals(str2)); 
System.out.println("Using == str1 and str2 Equals :" 
      + str1 == str2); 

La primera declaración SOP impresión

Usando iguales() cadena1 y cadena2 equivale a: verdadera impresión

y el siguiente SOP solamente falso

Intenté compilar tanto en eclipse como en Net Beans pero el resultado es el mismo. Estoy muy confundido por qué

== Usando cadena1 y cadena2 Igual:

no imprime

Ayúdame a cabo en este

Gracias de antemano,

Raj

+0

¿usted intentó encapsular la condición entre paréntesis es posible se añade la primera condición a la cadena después se evaluó con str2 – Josh

+2

' "Uso == cadena1 y cadena2 Igual:"?. + cadena1 == cadena2 'será el equivalente de '" Usar == str1 y str2 Igual a: "+" Rajesh "==" Rajesh "'. Como '+' tiene una precedencia mayor que '==' ('2 + 2 == 4'), tendremos el equivalente de' "Usando == str1 y str2 Igual a: Rajesh" == "Rajesh" ', que será 'falso'. –

+1

posible duplicado de [Java String.equals versus ==] (http://stackoverflow.com/questions/767372/java-string-equals-versus) –

Respuesta

11

es lo mismo que ("Using == str1 and str2 Equals :" + str1) == str2 y esto es falso, por supuesto. La expresión se analiza de izquierda a derecha y, al principio, concatena "Using == str1 and str2 Equals :" y str1, luego aplica el operador ==.

+0

Ayuda a esta respuesta mucho ... gracias .. – Raj

2

Tal vez una orden de cosas de las operaciones? Proveedores:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2)); 
+0

No hace ninguna diferencia –

+0

Sí, lo hace. – Bombe

-2

== sólo se puede utilizar para comparar los tipos de datos primitivos. Para comparar objetos, debe usar el método equals. El uso de un operador == en objetos realmente compara sus direcciones en lugar de valores.

+0

¿por qué la gente está votando por una respuesta incorrecta? – shift66

+2

Bueno, compara los valores, pero esos valores son referencias. Es incorrecto decir que '==' * solo se puede usar para comparar tipos de datos primitivos * cuando también se puede usar para probar la igualdad de referencia.En este caso, como estamos tratando con dos ocurrencias de la misma constante de cadena, '==' funcionaría bien, si se estuviera usando correctamente. –

+0

Teniendo en cuenta que la gran mayoría de los objetos que existen no anulan iguales y simplemente devuelve el resultado de ==. Es un error bastante común que veo que la gente simplemente asuma que "utilicé .equals así que esto funcionará bien". – Affe

-1

La razón es que no puede comparar cadenas en Java usando ==.

En C++ o C# (u otros lenguajes que admiten la redefinición del operador), puede sobrescribir el operador == para proporcionar esa funcionalidad. Java no es compatible con eso.

+1

Se refiere a sobrecarga, no sobrescribir (o anular). Y sí, * puedes * comparar referencias de cadenas usando '==' en Java. Comparará las referencias, no los objetos, pero eso funcionaría bien en este caso particular, si se hubiera utilizado correctamente. –

+0

Sí, quise decir sobrecarga. Y gracias por señalar esa referencia. Simplemente no lo sabía. – Abrixas2

2

Try rodeándola con() como esto:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2)); 
+0

No hay diferencia en absoluto –

+0

Funciona bien e imprime esto: 'Usando == str1 y str2 es igual a: verdadero'. La explicación está dada por @Ademiban –

-1

str1.equals(str2) rendimientos true porque la función equals() compara el contenido de las variables de cadena, donde como == operador compara los casos. Desde str1 y str2 dos diferencias de las instancias de la clase String, devuelve false

+2

Aquí, 'str1' y' str2' serán referencias idénticas a la misma cadena, debido a la forma en que el lenguaje maneja las constantes de cadena en tiempo de compilación. –

7

Ver http://bmanolov.free.fr/javaoperators.php para una tabla de precedencia de los operadores en Java.

El operador + tiene una precedencia mayor que el operador ==.

Así que, en efecto, su código es equivalente a la siguiente:

System.out.println(("Using == str1 and str2 Equals :" + str1) == str2); 

Nota de la colocación de los paréntesis que he añadido. Se evalúa a esto:

System.out.println((str_x + str1) == str2); 

Y luego a esto:

System.out.println(str_y == str2); 

Y luego a esto:

System.out.println(false); 

el fin de obtener el resultado deseado, debe utilizar paréntesis para especifique que desea que el operador == se resuelva ANTES del operador +:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2)); 

Observe la nueva ubicación de los paréntesis.

-1

En Java == operador Corresponde los dos objetos es decir su dirección mientras .equals() método mathces los valores de ambos objetos, es por eso que está recibiendo true para equals() y false para == ya que ambos son diferentes objetos.

0

El método equals devuelve verdadero si y solo si xey se refieren al mismo objeto.Follwoing es la implementación de la clase Object del método equals.

public boolean equals(Object obj) { 
    return (this == obj); 
    } 

En clase String, este método se ha anulado de la siguiente manera.

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
     char v1[] = value; 
     char v2[] = anotherString.value; 
     int i = offset; 
     int j = anotherString.offset; 
     while (n-- != 0) { 
      if (v1[i++] != v2[j++]) 
      return false; 
     } 
     return true; 
     } 
    } 
    return false; 
    } 

Y si utiliza el operador ==, simplemente compruebe que ambas referencias tengan el mismo objeto. Similar a la clase de objeto es igual al método.

3

Debido + tiene mayor prioridad a comparar = y si se utiliza el soporte (cadena1 == cadena2) entonces este resultado dan cierto porque es la más alta prioridad (. por lo que primero se comprueba soporte dentro de los datos.

String str1 = "Rajesh"; 
     String str2 = "Rajesh"; 
     System.out.println("Using equals() str1 and str2 Equals :" 
       + str1.equals(str2)); 
     System.out.println("Using == str1 and str2 Equals :" 
       + (str1 == str2)); 

salida:

Using equals() str1 and str2 Equals :true 
Using == str1 and str2 Equals :true