Heim  >  Artikel  >  Java  >  Eine kurze Diskussion über den Unterschied zwischen equal und ==

Eine kurze Diskussion über den Unterschied zwischen equal und ==

巴扎黑
巴扎黑Original
2017-06-23 16:37:431419Durchsuche

Wenn Sie zum ersten Mal Java lernen, stoßen Sie möglicherweise häufig auf den folgenden Code:

1 String str1 = new String("hello");

2 String str2 = new String("hello");

3        

4 System.out.println(str1==str2);

5 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“:

„Beziehungsoperatoren erzeugen einen Booleschen Wert.“ Ergebnis, und sie berechnen eine Beziehung zwischen den Werten ihrer Operanden.

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 Automatisch generierter Methoden-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. Das ist leicht zu verstehen. Die in der Variablen n und der Variablen m gespeicherten Werte sind beide 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)

  • Integer-Typ: Byte(1 Byte), Short(2 Byte), int (4 Byte) , long(8 Byte)

  • Zeichentyp: char(2 Byte)

  • Boolescher Typ: boolean (die JVM-Spezifikation legt die Größe des von ihr belegten Speicherplatzes nicht klar fest, sondern legt nur fest, dass nur Literalwerte angenommen werden können) wahr“ und „falsch“)

Bei Variablen dieser 8 Grunddatentypen speichern die Variablen direkt „Werte“, also beim Vergleich mit dem Vergleichsoperator = =, vergleichen ist der „Wert“ selbst. 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;

Variable n und Variable m speichern beide direkt den Wert „3“, sodass das Ergebnis beim Vergleich mit == wahr ist.

Variablen nicht grundlegender Datentypen werden in einigen Büchern als Referenztypvariablen bezeichnet. Beispielsweise ist str1 oben eine Variable vom Referenztyp. Eine Variable vom Referenztyp 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, Es ist derzeit keinem Objekt zugeordnet.

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 Objektreferenz bezeichnet), bei Diesmal speichert die Variable str1 die Speicheradresse des Objekts, auf das sie zeigt, im Speicher, nicht den „Wert“ selbst, dh es handelt sich nicht um die direkt gespeicherte Zeichenfolge „Hallo“. Die Referenzen hier sind den Zeigern in C/C++ sehr ähnlich.

Wenn Sie also == zum ersten Mal verwenden, um str1 und str2 zu vergleichen, ist das Ergebnis falsch. 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 vergleicht Gleiches?

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 in C:ProgrammeJavajdk1.6.0_14 (abhängig vom persönlichen JDK-Installationspfad). ).

Das Folgende ist die Implementierung der equal-Methode in der Object-Klasse:

Sehr offensichtlich wird in der Object-Klasse die Methode „equals“ verwendet, um zu vergleichen, ob die Referenzen zweier Objekte 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?

public class Main {

/**

     * @param args

     */

public static void main( String[] args) {

// TODO Automatisch generierter Methoden-Stub

String str1 = new String("hello");

String String str2 = new String("hello");

System.out.println(str1.equals(str2));

}

}

Um die Details zu erfahren, können Sie sich die spezifische Implementierung der Gleichheitsmethode der String-Klasse ansehen. Unter diesem Pfad befindet sich auch die Implementierung von String.java String-Klasse.

Das Folgende ist die spezifische Implementierung der Equals-Methode in der String-Klasse:

Es ist ersichtlich, dass die String-Klasse die Methode „equals“ überschreibt, um zu vergleichen, ob die in den gezeigten String-Objekten gespeicherten Strings gleich sind.

Einige andere Klassen, wie z. B. Double, Date, Integer usw., haben die Methode „equals“ überschrieben, um zu vergleichen, ob die in den Objekten, auf die verwiesen wird, gespeicherten Inhalte gleich sind.

Zusammengefasst:

1) Wenn == auf eine Variable eines Basisdatentyps einwirkt, wird deren gespeicherter Wert gespeichert " ist gleich;

Wenn es auf eine Referenztypvariable wirkt, ist der Vergleich die Adresse des Objekts, auf das verwiesen wird

2) Für Equals-Methode, Hinweis: Die Equals-Methode kann nicht auf Variablen grundlegender Datentypen wirken

Wenn die Equals-Methode nicht überschrieben wird, wird die Adresse des Objekts verglichen, auf das die Referenztypvariable zeigt . ;

Wenn Klassen wie String und Date die Methode „equals“ überschreiben, werden die Inhalte der Objekte, auf die verwiesen wird, verglichen.

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über den Unterschied zwischen equal und ==. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn