HOWTO · Java

Diferencia entre `!=` y la asignación con negación `=!` en Java

Este artículo explica la diferencia entre el operador de comparación `!=` y la secuencia `=!`, que representa una asignación combinada con negación en Java.

En esta página

En Java, != es el operador de comparación «distinto de»: devuelve true cuando sus operandos tienen valores diferentes. La secuencia de caracteres =! no es un operador. En una expresión como a = !b, Java interpreta = como asignación y ! como negación booleana, por lo que asigna a a el valor negado de b.

Los ejemplos siguientes muestran el resultado booleano de cada comparación y cómo la asignación combinada con la negación afecta a una condición.

Ejemplo de comparación de desigualdad != en Java

Usa != para comparar dos valores. Devuelve false si son iguales y true si son distintos. Con valores numéricos primitivos, compara los valores; con referencias, comprueba si estas apuntan a objetos diferentes. Para negar una comparación de igualdad, escribe !(a == b), que produce el mismo resultado booleano que a != b.

El operador produce un valor booleano, así que puede usarse directamente en una condición if o guardarse en una variable booleana. Por ejemplo, if (count != limit) se ejecuta cuando los dos valores primitivos son distintos. Al comparar objetos, != comprueba la identidad, no el contenido: dos objetos String distintos pueden contener el mismo texto y, aun así, resultar distintos según esta comparación. Usa equals cuando quieras comparar el contenido de los objetos. Los paréntesis de !(a == b) dejan claro el orden: primero se evalúa la igualdad y luego se niega el resultado. Esta equivalencia ayuda a leer condiciones más largas, aunque a != b suele ser la forma más breve.

public class Main {
  public static void main(String[] args) {
    int a = 10;
    int b = 10;
    System.out.println(a != b);

    a = 20;
    System.out.println(a != b);
    System.out.println(!(a == b));
  }
}
false
true
true

Con el primer par de valores, la comparación es falsa. Después de cambiar a, los valores son distintos, por lo que tanto la comparación de desigualdad como la expresión de igualdad negada son verdaderas.

Ejemplo de asignación y negación =! en Java

En Java no existe un operador combinado =!. En a = !b, Java evalúa primero !b y asigna ese resultado booleano a a. La misma asignación puede aparecer en una condición if: la condición recibe el valor booleano asignado y el bloque se ejecuta cuando ese valor es true. Esta forma es válida, pero modifica a mientras se comprueba la condición; si no hace falta asignarlo, una condición directa como if (!b) suele ser más fácil de leer.

La asignación tiene menor precedencia que la negación unaria, así que la expresión se agrupa como a = (!b). La expresión de asignación también tiene un valor booleano: produce el valor que acaba de guardarse en a. Por eso Java la acepta como condición de if; la condición no compara a con otro valor. Esto puede ser útil cuando la asignación es intencional, pero puede sorprender a quien espera una comparación. Si necesitas guardar un valor y hacer una prueba por separado, asigna primero y comprueba después en otra instrucción para que ambas acciones queden claras.

public class Main {
  public static void main(String[] args) {
    boolean a;
    boolean b = true;
    a = !b;
    System.out.println("a = " + a);

    b = false;
    if (a = !b) {
      System.out.println("condition is true; a = " + a);
    }
  }
}
a = false
condition is true; a = true

Cuando b es verdadero, !b es falso y ese valor se asigna a a. Más adelante, cuando b es falso, la asignación de la condición guarda true en a; ese valor verdadero hace que se ejecute el bloque if. Escribir la expresión como a = !b ayuda a distinguir la asignación de la negación, pero los espacios en blanco no cambian su significado.