Heim Java JavaBase Analyse von == und equal in Java

Analyse von == und equal in Java

Nov 27, 2019 pm 04:19 PM
== equals java 分析

Analyse von

Analyse von == und equal in Java

==

1 Für grundlegende Datentypen wird verglichen, ob ihre spezifischen Inhalte und ihr Gedächtnis gleich sind Adresse ist irrelevant.

Zum Beispiel:

public class Test{
	
	public static void main(String[] args) {
		int i = 10;
		double j = 10.0;
		float m = 10.0f;
		char k = 10;
		boolean b = true;
		
		System.out.println(i == j);
		System.out.println(i == m);
		System.out.println(m == k);
		System.out.println("*******************");
		//System.out.println(i == b);  很明显,布尔型不能和其他基本数据类型比较,编译报错.
		System.out.println(System.identityHashCode(i));
		System.out.println(System.identityHashCode(j));
		System.out.println(System.identityHashCode(m));
		System.out.println(System.identityHashCode(k));
		System.out.println(System.identityHashCode(b));
	}
}
Nach dem Login kopieren

Ausgabe:

true
true
true
*******************
366712642
1829164700
2018699554
1311053135
118352462
Nach dem Login kopieren

Verwandte Video-Tutorial-Empfehlung: Java kostenloses Video-Tutorial

Analyse :

① Gemäß den Vergleichsergebnissen und Speicheradressen sind die Inhalte gleich, aber die Speicheradressen sind unterschiedlich, aber die zurückgegebenen Ergebnisse sind alle wahr, was bedeutet, dass wir beim Vergleich nur prüfen, ob die Inhalte vorhanden sind Die in den Variablen gespeicherten Variablen sind gleich und haben nichts mit der Speicheradresse zu tun.

②== Die Daten auf beiden Seiten des Vergleichs müssen auf denselben Typ gezwungen werden. Beispielsweise wird der Vergleich zwischen int und double auf das Doppelte erzwungen.

③Boolesche Typen können nicht mit grundlegenden Datentypen wie int, float, double, char usw. verglichen werden und beim Kompilieren wird ein Fehler gemeldet.

2. Zum Vergleich von Referenzdatentypen:

public class Test{
	
	public static void main(String[] args) {
		Test t1 = new Test();
		Test t2 = new Test();
        String name1 = "琼宝";
		String name2 = "琼宝";
		
		System.out.println(name1 == name2);						 // true
		System.out.println(System.identityHashCode(name1));		 //366712642	
		System.out.println(System.identityHashCode(name2));		 //366712642
		
		System.out.println(t1 == t2);                             //false
		System.out.println(System.identityHashCode(t1));          //366712642
		System.out.println(System.identityHashCode(t2));          //1829164700
        System.out.println(System.identityHashCode(new Test()));  //2018699554
		System.out.println(System.identityHashCode(new Test()));  //1311053135
        System.out.println(new Test() == new Test());
	}
}
Nach dem Login kopieren

Ausgabe:

true
366712642
366712642
false
366712642
1829164700
2018699554
1311053135
false
Nach dem Login kopieren

Analyse:

①Für Referenzdatentypen, derzeit Dabei handelt es sich um zwei Speicherabschnitte, und der Vergleich besteht darin, ob die Speicheradressen gleich sind. Wenn beispielsweise die Anweisung

Test t1 = new Test() Test t2 = new Test() ausgeführt wird, werden zwei Speicherabschnitte geöffnet, einer zum Speichern von t1 und t2 und eine zum Speichern von zwei neuen Test(). Es ist offensichtlich, dass die Speicheradressen von t1 und t2 unterschiedlich sind, und sogar die Adressen der beiden neuen Test() sind unterschiedlich. Wenn also zu diesem Zeitpunkt == zum Vergleich verwendet wird, muss das Ergebnis falsch sein.

(Ergänzung: Was in t1 und t2 gespeichert ist, ist tatsächlich die erste Adresse des Speichers, der vom neuen Test()-Objekt verwendet wird.)

②Für den String-Typ, wenn der Inhalt ist das gleiche, die Speicheradressen sind ebenfalls gleich und die Adressen werden beim Vergleich ebenfalls berücksichtigt.

Wenn Sie vergleichen möchten, ob die im Objekt gespeicherten Inhalte gleich sind (ohne Adressen zu vergleichen), kann == nicht implementiert werden und ist gleich.

Analyse von Gleichheit

1. Schauen wir uns ein Beispiel für einen Gleichheitsvergleich an:

public class TestEquals {
	public static void main(String[] args) {
		
		TestEquals t1 = new TestEquals();
		TestEquals t2 = new TestEquals();
		System.out.println(t1.equals(t2));  //false
		
		String s1 = new String();
		String s2 = new String();		
	
        System.out.println(System.identityHashCode(s1));
		System.out.println(System.identityHashCode(s2));
		System.out.println(System.identityHashCode(new String()));
		System.out.println(System.identityHashCode(new String()));
        System.out.println(s1.equals(s2));  // true
	}
}

输出结果:
false
366712642
1829164700
2018699554
1311053135
true
Nach dem Login kopieren

2. Analyse:

①t1 und Der Vergleich von t2 ist falsch und der Vergleich von s1 und s2 ist wahr. Dazu muss die Methode „equals“ neu geschrieben werden. Schauen Sie sich zunächst den Quellcode von „equals“ in der Object-Klasse an:

public boolean equals(Object obj) {
        return (this == obj);
    }
Nach dem Login kopieren

② For s1.equals(s2), das ist s1, obj ist s2, und der Vergleich im Quellcode verwendet ==, was offensichtlich ein Vergleich von Referenzdatentypen ist, wenn man die Speicheradressen von s1 und s2 betrachtet Es ist bereits bekannt, dass ihre Adressen unterschiedlich sind.

③ Und das Vergleichsergebnis zwischen s1 und s2 ist wahr. Dies liegt daran, dass die Methode „equals“ neu geschrieben wurde Quellcode:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
Nach dem Login kopieren

④ Bestanden Beim Vergleich mit dem Gleichheitsquellcode im Objekt können wir sehen, dass die Gleichheitsmethode in String nicht mehr die Adresse des Objekts vergleicht, sondern den Inhalt der beiden Objekte betrachtet. oder ob die Attribute der beiden Objekte gleich sind.

⑤Klassen wie String, Datum, Datei usw. schreiben alle die Methode equal neu.

Zusammenfassung:

1.== ​​​​Beim Vergleich grundlegender Datentypen wird verglichen, ob die Inhalte gleich sind Bei Referenzdatentypen kommt es darauf an, ob die Speicheradressen gleich sind.

2.equals kann nur Referenzdatentypen (Objekte) vergleichen. Vor dem Umschreiben wird == zum Vergleichen von Speicheradressen verwendet. Nach dem Umschreiben wird überprüft, ob der spezifische Inhalt und die Attribute der Objekte konsistent sind.

Weitere verwandte Artikel und Tutorials finden Sie unter: Einführung in die Java-Programmierung

Das obige ist der detaillierte Inhalt vonAnalyse von == und equal in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

See all articles