Wenn Sie zum ersten Mal Java lernen, stoßen Sie möglicherweise häufig auf den folgenden Code:
String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); System.out.println(str1.equals(str2));
Warum sind die Ausgabeergebnisse der Zeilen 4 und 5 unterschiedlich? Was ist der Unterschied zwischen den Methoden == und equal? Wenn Sie dies beim ersten Erlernen von Java nicht herausfinden, werden Sie in Zukunft beim Schreiben von Code einige geringfügige Fehler machen. Heute lernen wir den Unterschied zwischen den Methoden == und equal kennen.
1. Was genau vergleicht der Vergleichsoperator „=="?
Der folgende Satz ist ein Auszug aus dem Buch „Java Programming Thoughts“:
„Relationale Operatoren generieren ein boolesches Ergebnis und berechnen den Wert der Operanden. Beziehung“.
Dieser Satz scheint einfach, muss aber dennoch sorgfältig verstanden werden. Einfach ausgedrückt wird == verwendet, um zu vergleichen, ob Werte gleich sind. Schauen wir uns ein paar Beispiele an:
public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int n=3; int m=3; System.out.println(n==m); String str = new String("hello"); String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); str1 = str; str2 = str; System.out.println(str1==str2); } }
Das Ausgabeergebnis ist wahr, falsch, wahr
Das Ergebnis von n==m ist wahr. Die gespeicherten Werte sind leicht zu verstehen in Variable n und Variable m sind beide 3, sie sind definitiv gleich. Und warum sind die Ergebnisse der beiden Vergleiche von str1 und str2 unterschiedlich? Um dies zu verstehen, müssen Sie nur den Unterschied zwischen Variablen vom Basisdatentyp und Variablen vom Nicht-Basisdatentyp verstehen.
Es gibt 8 grundlegende Datentypen in Java:
Gleitkommatyp: Float (4 Byte), Double (8 Byte)
Ganzzahltyp: Byte (1 Byte) , short(2 byte), int(4 byte), long(8 byte)
Zeichentyp: char(2 byte)
Boolescher Typ: boolean (JVM-Spezifikation spezifiziert seine nicht eindeutig Der Platzbedarf ist lediglich so festgelegt, dass nur Literalwerte „wahr“ und „falsch“ angenommen werden können.)
Bei Variablen dieser 8 Grunddatentypen speichern die Variablen direkt „Werte“, also Die Beziehung wird verwendet. Beim Vergleich mit dem Operator == wird der „Wert“ selbst verglichen. Es ist zu beachten, dass sowohl Gleitkomma- als auch Ganzzahltypen vorzeichenbehaftete Typen sind, während char ein vorzeichenloser Typ ist (der Wertebereich des char-Typs beträgt 0~2^16-1). Das heißt, zum Beispiel:
int n=3;
int m=3;
Sowohl Variable n als auch Variable m speichern direkt den Wert „3“, also beim Vergleich mit = = Das Ergebnis ist wahr.
Variablen von nicht grundlegenden Datentypen werden in einigen Büchern als Referenztypvariablen bezeichnet. Beispielsweise ist str1 oben eine Referenztypvariable. Eine Referenztypvariable speichert nicht den „Wert“ selbst, sondern die Adresse des zugehörigen Objekts im Speicher. Zum Beispiel die folgende Codezeile:
String str1;
Dieser Satz deklariert eine Referenztypvariable, die derzeit keinem Objekt zugeordnet ist.
Und verwenden Sie new String("hello"), um ein Objekt (auch Instanz der String-Klasse genannt) zu generieren und dieses Objekt an str1 zu binden:
str1= new String ("hello ");
Dann zeigt str1 auf ein Objekt (str1 wird an vielen Stellen auch als Referenz auf ein Objekt bezeichnet). Zu diesem Zeitpunkt speichert die Variable str1 die Speicheradresse des Objekts, auf das sie zeigt, im Speicher. Es ist nicht der „Wert“ selbst, also nicht die direkt gespeicherte Zeichenfolge „Hallo“. Die Referenzen hier sind den Zeigern in C/C++ sehr ähnlich.
Daher ist das Ergebnis falsch, wenn == zum ersten Mal zum Vergleichen von str1 und str2 verwendet wird. Daher verweisen sie jeweils auf unterschiedliche Objekte, was bedeutet, dass die Speicheradressen, an denen sie tatsächlich gespeichert sind, unterschiedlich sind.
Im zweiten Vergleich zeigen sowohl str1 als auch str2 auf das Objekt, auf das str zeigt, sodass das Ergebnis zweifellos wahr ist.
2. Was ist gleich?
Die Methode equal ist eine Methode in der Basisklasse Object, daher verfügen alle Klassen, die von Object erben, über diese Methode. Um die Rolle der Equals-Methode intuitiver zu verstehen, schauen wir uns direkt die Implementierung der Equals-Methode in der Object-Klasse an.
Der Quellcodepfad dieser Klasse lautet: Object.java unter dem java.lang-Pfad von src.zip von C:Program FilesJavajdk1.6.0_14 (abhängig vom persönlichen JDK-Installationspfad).
Das Folgende ist die Implementierung der Methode equal in der Object-Klasse:
Offensichtlich wird in der Object-Klasse die Methode equal zum Vergleichen verwendet Referenzen zweier Objekte, ob sie gleich sind, das heißt, ob sie auf dasselbe Objekt verweisen.
Aber einige Freunde haben vielleicht wieder Fragen: Warum ist das Ausgabeergebnis des folgenden Codes wahr?
Um es genau zu wissen, können Sie sich die spezifische Implementierung der Gleichheitsmethode der String-Klasse ansehen. Unter diesem Pfad befindet sich auch String.java die Implementierung der String-Klasse.public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1.equals(str2)); } }
Das Folgende ist die spezifische Implementierung der Equals-Methode in der String-Klasse:
Es ist ersichtlich, dass die String-Klasse die Equals-Methode zum Vergleichen neu schreibt Punkte Ob die in den String-Objekten gespeicherten Strings gleich sind.
Einige andere Klassen wie Double, Date, Integer usw. haben die Methode equals überschrieben, um zu vergleichen, ob die in den verwiesenen Objekten gespeicherten Inhalte gleich sind.
Zusammengefasst:
1) Wenn == auf eine Variable eines Basisdatentyps einwirkt, wird direkt verglichen, ob der gespeicherte „Wert“ gleich ist.
Wenn es auf eine Variable eines Referenztyps einwirkt , werden die Punkte verglichen, auf die verwiesen wird Die Adresse des Objekts
2) Beachten Sie bei der Methode „equals“: Die Methode „equals“ kann nicht auf Variablen grundlegender Datentypen reagieren
Wenn die Methode „equals“ ist nicht überschrieben, der Referenztyp wird verglichen. Die Adresse des Objekts, auf das die Variable zeigt.
Wenn Klassen wie String und Date die Methode equal überschreiben, wird der Inhalt des Objekts verglichen, auf das verwiesen wird.
Für weitere Artikel über equal und == in Java achten Sie bitte auf PHP-Chinesisch netto!