HOWTO · Java

Diferença entre `!=` e `=!` em Java: comparação, atribuição e negação

Este artigo explica a diferença entre `!=`, o operador de comparação de desigualdade em Java, e `=!`, a sequência de caracteres em uma expressão de atribuição e negação.

Nesta página

Em Java, != é o operador de comparação de desigualdade: ele resulta em true quando os operandos têm valores diferentes. A sequência de caracteres =! não é um operador. Em uma expressão como a = !b, Java interpreta = como atribuição e ! como negação booleana; assim, o valor negado de b é atribuído a a.

Os exemplos a seguir mostram o resultado booleano de cada comparação e como a atribuição combinada com a negação afeta uma condição.

Exemplo de comparação de desigualdade != em Java

Use != para comparar dois valores. O resultado é false quando eles são iguais e true quando são diferentes. Para valores numéricos primitivos, o operador compara os valores; para valores de referência, verifica se as referências identificam objetos diferentes. Para negar uma comparação de igualdade, escreva !(a == b), que produz o mesmo resultado booleano que a != b.

O operador produz um valor booleano, então pode ser usado diretamente em uma condição if ou armazenado em uma variável booleana. Por exemplo, if (count != limit) é executado quando os dois valores primitivos são diferentes. Ao comparar objetos, != verifica a identidade, e não o conteúdo deles: dois objetos String distintos podem conter o mesmo texto e ainda assim serem considerados diferentes por identidade. Use equals quando quiser comparar o conteúdo dos objetos. Os parênteses em !(a == b) deixam a ordem explícita: primeiro a igualdade é avaliada e, em seguida, seu resultado é negado. Essa equivalência ajuda a entender condições mais longas, embora a != b geralmente seja a forma mais curta.

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

Com o primeiro par de valores, a comparação resulta em falso. Depois que a muda, os valores ficam diferentes; por isso, tanto a comparação de desigualdade quanto a expressão de igualdade negada resultam em verdadeiro.

Exemplo de atribuição e negação com =! em Java

Não existe um operador combinado =! em Java. Em a = !b, Java primeiro avalia !b e atribui esse resultado booleano a a. A mesma atribuição pode aparecer em uma condição if: a condição recebe o valor booleano atribuído, e o bloco é executado quando esse valor é verdadeiro. Essa forma é válida, mas altera a enquanto verifica a condição; por isso, quando a atribuição não é necessária, uma condição direta como if (!b) costuma ser mais fácil de ler.

A atribuição tem precedência menor que a negação unária, então a expressão é agrupada como a = (!b). A própria expressão de atribuição também tem um valor booleano: ela resulta no valor que acabou de ser armazenado em a. Por isso Java a aceita como condição de if; a condição não compara a com outro valor. Isso pode ser útil quando a atribuição é intencional, mas pode surpreender quem espera uma comparação. Se você precisa salvar um valor e fazer um teste separado, atribua primeiro e teste em outra instrução para deixar claras as duas ações.

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

Quando b é verdadeiro, !b é falso e esse valor é atribuído a a. Mais tarde, quando b é falso, a atribuição na condição armazena verdadeiro em a; esse valor verdadeiro faz o bloco if ser executado. Escrever a expressão como a = !b, com espaços, ajuda a distinguir a atribuição da negação, mas os espaços em branco não alteram seu significado.