Wie vergleiche ich int und wie vergleiche ich Strings korrekt?

Primitive Datentypen (int, double, …) vergleicht man mit dem Operator ==.

Den Inhalt von Objekten, wie z.B. Strings vergleicht man mit der Methode equals().

String s = "Hello World";
String s1 = "Hello World";
System.out.println(s.equals(s1)); // ergibt true

Vergleicht man Objekte mit ==, wird ein Vergleich der Referenzen durchgeführt. Das heißt, es wird überprüft, ob beide Referenzen auf dasselbe Objekt zeigen.

Beim Vergleich von Strings mit dem Operator == kann es zu überraschenden Ergebnissen kommen.

Beispiel:

String s1 = "Hello World";
String s2 = "Hello World";
String s3 = "Hello ";
s3 += "World";
System.out.println(s1 == s2); // ergibt true
System.out.println(s1 == s3); // ergibt false
System.out.println(s1.equals(s3)); // ergibt true

String-Literale werden in Java in einem String-Pool verwaltet. Bei der Zuweisung eines String-Literals an eine Variable prüft die virtuelle Maschine, ob das Literal bereits im Pool vorhanden ist. Ist das der Fall, wird eine Referenz auf das bereits vorhandene Literal im Pool gesetzt. Ansonsten wird ein neues String-Literal im Pool abgelegt und referenziert.

Zeile 1: Der String “Hello World” wird im Pool abgelegt und von s1 referenziert.
Zeile 2: s2 referenziert den im Pool abgelegten String.
Zeile 3: Der String “Hello ” wird im Pool abgelegt und von s3 referenziert.
Zeile 4: Bei der Konkatenation von Strings wird ein neues String-Objekt erzeugt und von s3 referenziert.

Zeile 5: Der Vergleich ergibt true, weil beide Referenzen auf dasselbe Objekt im Pool zeigen.
Zeile 6: Der Vergleich ergibt false. Da bei der Konkatenation in Zeile 4 ein neues Objekt erzeugt wurde, referenzieren s1 und s3 verschiedene Objekte.
Zeile 7: Der Vergleich des Inhalts von s1 und s3 ergibt true;