Heim Java javaLernprogramm Eine kurze Diskussion über equal und == in Java

Eine kurze Diskussion über equal und == in Java

Dec 16, 2016 am 09:18 AM
equals

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

1

2

3

4

5

String str1 = new String("hello");

String str2 = new String("hello");

         

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

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

Nach dem Login kopieren

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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);

    }

 

}

Nach dem Login kopieren

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:

Eine kurze Diskussion über equal und == in Java 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.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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));

    }

}

Nach dem Login kopieren

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

Eine kurze Diskussion über equal und == in Java 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!


Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

See all articles