Weil gleich ist () für String vergleicht den Inhalt, nicht das Objekt selbst.
%Vor%public boolean ist gleich (Object anObject)
Vergleicht diese Zeichenfolge mit dem angegebenen Objekt. Das Ergebnis ist nur dann wahr, wenn das Argument nicht null ist und ein Objekt
String
ist, das die gleiche Zeichenfolge wie dieses Objekt darstellt.
(Link zur Quelle von String.equals () )
Im Gegensatz zu Gleich ist für Objekt :
%Vor%Die equals-Methode für die Klasse
Object
implementiert die höchstmögliche Äquivalenzrelation für Objekte; Das heißt, für alle Nicht-Null-Referenzwertex
undy
gibt diese Methode true zurück, wennx
undy
sich auf dasselbe Objekt beziehen (x == y
hat den Werttrue
).
(Link zur Quelle von Object.equals () )
Vergessen Sie auch nicht den Vertrag der Funktion equals()
:
Die equals-Methode implementiert eine Äquivalenzbeziehung für Nicht-Null-Objektreferenzen:
- Es ist reflexiv : Für jeden Nicht-Null-Referenzwert
x
solltex.equals(x)
den Wert true zurückgeben.- Es ist symmetrisch : Für alle Nicht-Null-Referenzwerte
x
undy
solltex.equals(y)
genau dann true zurückgeben, wenny.equals(x)
true zurückgibt.- Es ist transitiv : für alle Nicht-Null-Referenzwerte
x
,y
undz
, wennx.equals(y)
true
zurückgibt undy.equals(z)
returnstrue
, dann solltex.equals(z)
true
zurückgeben.- Es ist konsistent : Für alle Nicht-Null-Referenzwerte
x
undy
geben mehrere Aufrufe vonx.equals(y)
konsistenttrue
zurück oder geben konsistentfalse
zurück, vorausgesetzt, es liegen keine Informationen vor in Gleich-Vergleichen auf den Objekten verwendet wird geändert.- Für jeden Nicht-Null-Referenzwert
x
solltex.equals(null)
false
zurückgeben.
Auch empfohlen zu lesen:
==
vergleicht Adressen der Objekte / Strings / irgendetwas
.equals()
wurde entwickelt, um den internen Status der Objekte zum Vergleich zu verwenden.
Also:
new Object() == new Object() => false
- zwei separate Objekte an verschiedenen Adressen im Speicher.
new String("a") == new String("a") => false
- die gleiche Situation - zwei separate Adressen für die String-Objekte.
new String("a").equals(new String("a")) => true
- Adressen unterscheiden sich, aber Java nimmt einen Objektzustand ('a') und vergleicht es mit anderen Objektzuständen ('a'), werden sie gleich gefunden und melden wahr.
Mit der Methode equals () können Sie den Vergleich so programmieren, wie es für Ihr Programm geeignet ist.
intern()
ist eine etwas andere Geschichte. Es ist beabsichtigt, dasselbe Objekt (Adresse) für dieselbe Char-Sequenz zurückzugeben. Es ist nützlich, die Menge an Speicher zu reduzieren, die benötigt wird, wenn Sie mehrere Zeichenfolgen gleichzeitig konstruieren.
new String("aaa").intern()
sucht im Maschinenspeicher, wenn jemand zuvor eine "aaa" Zeichenkette erstellt hat und gibt die erste Instanz der Zeichenkette zurück ... Wenn nicht gefunden wurde - die aktuelle wird als erste und alle eingetragen weiter "aaa" .intern () und new String("aaa").intern()
und ("a"+"aa").intern()
geben diese "erste" Instanz zurück.
Vorsicht: "aaa".intern()
ist keine sehr schnelle Operation und wenn Sie alle Strings internieren, sparen Sie etwas Speicher, verlieren aber eine Menge CPU-Arbeit.
Das in der Klasse equals
implementierte Object
vergleicht nur Referenzen. Hier ist der Quellcode:
equals muss in der Klasse außer Kraft gesetzt werden, wenn sie sich anders verhalten soll. Standardmäßig prüft es, ob sich zwei Referenzen auf dasselbe Objekt beziehen.
Die Methode equals()
der Klasse Object
kann Strings nicht vergleichen, sie kann nur Objekte vergleichen. Zum Vergleichen von Zeichenfolgen überschreibt eine Zeichenfolgenklasse die equals()
-Methode und vergleicht Zeichenfolgen darin.
Object.equals()
vergleicht nur Referenzen, wobei String.equals()
Werte vergleicht.