Java String vergleichen (==)?

... komplette Frage anzeigen

8 Antworten

String-Konstante werden "interned" (Java Language Specification, 3.10.5. String Literals). Gleiche Strings werden damit zusammengefasst. Auch der Operator + funktioniert so bei konstanten Argumenten.

Zur Laufzeit berechnete Strings kannst Du mit String.intern() in diesen Pool aufnehmen und danach sicher mit == vergleichen:

String a = "Hallo";
String b = "Hal" + "lo";
System.out.println(a==b); // true

b = "Hasso".replace('s', 'l');
System.out.println(a==b); // false

b.intern();
System.out.println(a==b); // true

Alles klar?

Antwort bewerten Vielen Dank für Deine Bewertung

Beim Gleichheitsoperator kommt es nicht darauf an, wie die Variable heisst, sondern was der Inhalt der Variable ist.

Das heisst, dass der Gleichheitsoperator in deinem Fall momentan Überprüft ob Hallo im String a gleich Hallo im b ist. Das ist natürlich der Fall.

Wenn nun aber bei b Halllo steht, dann stimmt das nicht mehr (Hallo =/= Halllo). Deshalb kommt Nicht gleich statt gleich

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Belaro
19.04.2016, 22:39

Okay, ich glaube, ich habe hier etwas falsch Verstanden.

1
Kommentar von Paranormal43
19.04.2016, 23:09

Ich will ja nicht den Inhalt vergleichen. Ich will abfragen, ob die Referenzvariablen a und b auf das gleiche Objekt verweisen, aber das wurde schon geklärt.

0

Java verwendet einen String-Pool. D.h. wenn es bereits einen String hat, in dem "Hallo" steht, legt es keinen neuen an, sondern verweist auf den existierenden. Daher sind es dieselben String-Objekte.

Es sei denn, man fordert mit "new" explizit ein neues Objekt an. Dann sind es unterschiedliche Objekte.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ralphdieter
19.04.2016, 23:42

Dann sind es unterschiedliche Objekte.

Ist das garantiert? Ich kann in der Referenz keinen Hinweis dazu finden.

0

Ich bin schon etwas angerostet in Java, aber ich denke mit dem oberen Code vergleichst du den Wert der Referenzvariablen. Dieser ist bei beiden Hallo, also "Gleich". Mit String a,b = new String("Hallo") erschaffst du ja 2 neue Objekte vom Typ String mit dem Attribut Hallo. Objekt a ist aber nicht Objekt b, daher gibt der zweite Vergleich ein "Nicht gleich"

Antwort bewerten Vielen Dank für Deine Bewertung

Für String und andere nicht primitive Typen solltest du die .equals() Methode benutzen und diese bei eigenen Klassen möglichst auch implementieren.

Antwort bewerten Vielen Dank für Deine Bewertung

Ich glaube weil a und b beide die Konstante "Hallo" zugeweiesen bekommen, und das ist nicht jeweils ein new String sonder derselbe, deshalb gleich. (Ist etwas komisch in dem Sinne..)

a/b = new String(...) ist unterschiedlich, da 2 unterschiedliche Instanzen.

Antwort bewerten Vielen Dank für Deine Bewertung

Das macht man nicht mit ==, man nutzt 

a.equals(b)

== funktioniert nur wenn es sich um primitive Datentypen handelt, oder um einen Pointer auf das Gleiche Objekt.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Paranormal43
19.04.2016, 23:08

Ich will ja nicht den Inhalt vergleichen. Ich will abfragen, ob die Referenzvariablen a und b auf das gleiche Objekt verweisen, aber das wurde schon geklärt.

0

Dasselbe Programm, das du geschrieben hast, habe ich mit einer alten Java-Version (1.1 oder 1.2) vor über zehn Jahren geschrieben.

Ergebnis damals: "Nicht gleich"

Bei der Frage, wie sich dein Programm verhält, spielt also auch die Java-Version eine Rolle...

Im Endeffekt ist es wohl nicht genau definiert, ob in diesem Fall "a" und "b" auf dasselbe String-Objekt verweisen sollen oder nicht, weswegen sich unterschiedliche Java-Versionen unterschiedlich verhalten.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?