HOWTO · Java

Java: `!=` als Ungleichheitsvergleich und `=!` bei Zuweisung und Negation

Dieser Artikel erklärt den Unterschied zwischen dem Ungleichheitsvergleich `!=` und der Zeichenfolge `=!` in einem Ausdruck mit Zuweisung und boolescher Negation in Java.

Auf dieser Seite

In Java ist != der Ungleichheitsoperator: Er ergibt true, wenn seine Operanden unterschiedliche Werte haben. Die Zeichenfolge =! ist kein Operator. In einem Ausdruck wie a = !b interpretiert Java = als Zuweisung und ! als boolesche Negation. Der negierte Wert von b wird also a zugewiesen.

Die folgenden Beispiele zeigen das boolesche Ergebnis der Vergleiche und wie sich eine Zuweisung in Verbindung mit einer Negation auf eine Bedingung auswirkt.

Java: Beispiel für den Ungleichheitsvergleich mit !=

Mit != vergleichst du zwei Werte. Sind sie gleich, ergibt der Vergleich false; unterscheiden sie sich, ergibt er true. Bei primitiven numerischen Werten werden die Werte verglichen. Bei Referenzwerten wird geprüft, ob die Referenzen auf unterschiedliche Objekte verweisen. Eine Gleichheitsprüfung lässt sich mit !(a == b) negieren; der boolesche Rückgabewert ist derselbe wie bei a != b.

Der Operator liefert einen booleschen Wert und kann daher direkt in einer if-Bedingung verwendet oder in einer booleschen Variablen gespeichert werden. Zum Beispiel wird if (count != limit) ausgeführt, wenn sich die beiden primitiven Werte unterscheiden. Beim Vergleich von Objekten prüft != die Identität und nicht den Inhalt: Zwei verschiedene String-Objekte können denselben Text enthalten und beim Identitätsvergleich trotzdem als ungleich gelten. Verwende equals, wenn du den Inhalt von Objekten vergleichen möchtest. Die Klammern in !(a == b) machen die Reihenfolge deutlich: Zuerst wird die Gleichheit geprüft, anschließend das Ergebnis negiert. Diese gleichwertige Schreibweise kann beim Lesen einer längeren Bedingung hilfreich sein; a != b ist jedoch meist kürzer.

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

Beim ersten Wertepaar ist das Vergleichsergebnis false. Nachdem sich a ändert, sind die Werte verschieden. Daher ergeben sowohl der Ungleichheitsvergleich als auch der negierte Gleichheitsvergleich true.

Java: Beispiel für Zuweisung und Negation mit =!

In Java gibt es keinen kombinierten =!-Operator. Bei a = !b wertet Java zuerst !b aus und weist a anschließend dieses boolesche Ergebnis zu. Dieselbe Zuweisung kann in einer if-Bedingung stehen: Die Bedingung erhält den zugewiesenen booleschen Wert, und der Block wird ausgeführt, wenn dieser Wert true ist. Diese Schreibweise ist zulässig, verändert aber a, während die Bedingung geprüft wird. Wenn die Zuweisung nicht nötig ist, ist eine direkte Bedingung wie if (!b) oft leichter verständlich.

Die Zuweisung hat eine niedrigere Priorität als die unäre Negation. Der Ausdruck wird daher als a = (!b) gruppiert. Auch der Zuweisungsausdruck selbst hat einen booleschen Wert: Er ergibt den Wert, der gerade in a gespeichert wurde. Deshalb akzeptiert Java ihn als Bedingung für if; dabei wird a nicht mit einem anderen Wert verglichen. Eine solche Schreibweise kann sinnvoll sein, wenn die Zuweisung beabsichtigt ist, aber sie kann überraschen, wenn jemand einen Vergleich erwartet. Wenn du sowohl einen Wert speichern als auch eine separate Prüfung vornehmen möchtest, führe die Zuweisung zuerst aus und prüfe den Wert anschließend in einer eigenen Anweisung.

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

Wenn b den Wert true hat, ist !b gleich false, und dieser Wert wird a zugewiesen. Später, wenn b gleich false ist, speichert die Zuweisung in der Bedingung true in a; dieser Wert sorgt dafür, dass der if-Block ausgeführt wird. Die Schreibweise a = !b macht Zuweisung und Negation leichter unterscheidbar. Leerzeichen ändern jedoch nichts an der Bedeutung.