Java Language Los operadores de igualdad (==,! =)


Ejemplo

Los operadores == y != Son operadores binarios que se evalúan como true o false dependiendo de si los operandos son iguales. El operador == da true si los operandos son iguales y false contrario. El operador != Da false si los operandos son iguales y true contrario.

Estos operadores pueden usarse operandos con tipos primitivos y de referencia, pero el comportamiento es significativamente diferente. Según el JLS, en realidad hay tres conjuntos distintos de estos operadores:

  • Los operadores booleanos == y != .
  • Los operadores numéricos == y != .
  • Los operadores Reference == y != .

Sin embargo, en todos los casos, el tipo de resultado de los operadores == y != Es boolean .

Los operadores numéricos == y !=

Cuando uno (o ambos) de los operandos de un operador == o != Es un tipo numérico primitivo ( byte , short , char , int, long , float o double ), el operador es una comparación numérica. El segundo operando debe ser un tipo numérico primitivo o un tipo numérico en caja.

El comportamiento de otros operadores numéricos es el siguiente:

  1. Si uno de los operandos es un tipo de caja, es sin caja.
  2. Si cualquiera de los operandos ahora un byte , short o char , se promueve a un int .
  3. Si los tipos de los operandos no son los mismos, entonces el operando con el tipo "más pequeño" se promueve al tipo "más grande".
  4. La comparación se realiza de la siguiente manera:
    • Si los operandos promovidos son int o long , los valores se prueban para ver si son idénticos.
    • Si los operandos promovidos son float o double entonces:
      • las dos versiones de cero ( +0.0 y -0.0 ) se tratan como iguales
      • un valor NaN se trata como no igual a nada, y
      • otros valores son iguales si sus representaciones IEEE 754 son idénticas.

Nota: debe tener cuidado al usar == y != Para comparar valores de punto flotante.

Los operadores booleanos == y !=

Si ambos operandos son boolean , o uno es boolean y el otro es Boolean , estos operadores son los operadores booleano == y != . El comportamiento es el siguiente:

  1. Si uno de los operandos es un Boolean , es unboxed.
  2. Los operandos sin caja se prueban y el resultado booleano se calcula de acuerdo con la siguiente tabla de verdad
UNA segundo A == B A! = B
falso falso cierto falso
falso cierto falso cierto
cierto falso falso cierto
cierto cierto cierto falso

Hay dos "trampas" que hacen que sea aconsejable usar == y != moderación con los valores de verdad:

Los operadores Reference == y !=

Si ambos operandos son referencias a objetos, los operadores == y != Comprueban si los dos operandos se refieren al mismo objeto . Esto a menudo no es lo que quieres. Para probar si dos objetos son iguales por valor , se debe usar el método .equals() su lugar.

String s1 = "We are equal";
String s2 = new String("We are equal");

s1.equals(s2); // true

// WARNING - don't use == or != with String values
s1 == s2;      // false

Advertencia: el uso de == y != Para comparar valores de String es incorrecto en la mayoría de los casos; vea http://www.riptutorial.com/java/example/16290/pitfall--using----to-compare-strings . Un problema similar se aplica a los tipos de envoltorios primitivos; vea http://www.riptutorial.com/java/example/8996/pitfall--using----to-compare-primitive-wrappers-objects-such-as-integer .

Acerca de los casos de borde de NaN

JLS 15.21.1 establece lo siguiente:

Si cualquiera de los operandos es NaN , entonces el resultado de == es false pero el resultado de != Es true . De hecho, la prueba x != x es true si y solo si el valor de x es NaN .

Este comportamiento es (para la mayoría de los programadores) inesperado. Si prueba si un valor de NaN es igual a sí mismo, la respuesta es "¡No, no lo es!". En otras palabras, == no es reflexivo para los valores de NaN .

Sin embargo, esto no es una "rareza" de Java, este comportamiento se especifica en los estándares de punto flotante IEEE 754 y encontrará que está implementado por la mayoría de los lenguajes de programación modernos. (Para obtener más información, consulte http://stackoverflow.com/a/1573715/139985 ... ¡note que esto está escrito por alguien que estaba "en la sala cuando se tomaron las decisiones"!)