Der Unterschied und die Verwendung von equal() und == in Java

WBOY
Freigeben: 2024-03-07 15:28:11
nach vorne
342 Leute haben es durchsucht

In der Java-Entwicklung gibt es eine scheinbar einfache, aber im Internet viele Themen und Fragen: Was ist der Unterschied zwischen equal() und dem ==-Operator

  • ==: Der Operator wird verwendet, um zwei zu vergleichen. Ob die Adressen von Objekten gleich sind
  • equals(): Die Methode wird verwendet, um zu vergleichen, ob der Inhalt von zwei Objekten gleich ist

Um diesen Unterschied besser zu verstehen, schauen wir uns ein Beispiel an:

String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1.equals(str2)); // 输出 trueSystem.out.println(str1 == str2); // 输出 false
Nach dem Login kopieren
Der Unterschied und die Verwendung von equal() und == in JavaObwohl im Beispiel der Inhalt der beiden Zeichenfolgen gleich ist, sind ihre Adressen im Speicher unterschiedlich. Daher wird die Verwendung der .equals()-Methode zum Vergleichen ihrer Inhalte „true“ zurückgeben, während die Verwendung des „==“-Operators zum Vergleichen ihrer Adressen „false“ zurückgeben wird1 Überschreiben Sie die .equals()-Methode

Wenn Sie das gelernt haben Grundlagen von Java: Sie sollten wissen, dass alle Klassen in Java standardmäßig die Object-Klasse erben. In der Object-Klasse gibt es eine .equals()-Methode Für den Vergleich wird standardmäßig der ==-Operator verwendet. Wenn die Unterklasse die Methode equal() nicht überschreibt, ist das Ergebnis bei Verwendung des Operators == und der Methode equal() genau das gleiche – sie werden zum Vergleichen verwendet, ob die Speicheradressen der beiden Objekte sind gleich.
Aber die tatsächliche Situation ist, dass es viele Klassen gibt, die die Methode equal() überschreiben. Dies liegt daran, dass die Anforderungen an den Speicheradressenvergleich streng sind und nicht die Anforderungen aller realen Szenarien erfüllen. Beim Vergleich möchten die meisten nur den Inhalt beurteilen. Ob sie gleich sind, möchte ich nicht wirklich wissen, ob die Speicheradressen gleich sind (ob sie ein Objekt sind).

In dem Artikel über die eingehende Untersuchung des Java-String-Konstanten-Pools haben wir erfahren, dass die Java Virtual Machine einen separaten Platz für Strings – den String-Konstanten-Pool – zuweist, um die Speichernutzung zu optimieren und die Leistung zu verbessern.

Es wird empfohlen, ein String-Objekt mit String s = „Hello“ zu erstellen, anstatt das Schlüsselwort new zu verwenden, da new eine zusätzliche Zuweisung von Speicherplatz auf dem Heap erfordert.

1.1. Die equal()-Methode der String-Klasse
Die equal()-Methode der String-Klasse von Jdk11

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

Besondere Hinweise: Latin1 (auch bekannt als ISO 8859-1) und UTF-16 (Unicode Konvertierungsformat 16-Bit) sind zwei verschiedene Zeichenkodierungsmethoden

Latin1 und UTF-16 sind zwei Kodierungsmethoden, aber der Unterschied ist nicht groß. Nehmen Sie die equal()-Methode von UTF-16, um zu sehen

public boolean equals(Object anObject) { //如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;} //如果是String类型的实例if (anObject instanceof String) { //Object类型的对象强制转换为String类型String aString = (String)anObject;//如果当前字符串对象和传入的字符串对象的编码方式相同if (coder() == aString.coder()) { //如果当前字符串和传入的字符串都是Latin1编码,则调用StringLatin1类的equals方法进行比较;如果其中一个或两个字符串是UTF16编码,则调用StringUTF16类的equals方法进行比较return isLatin1() ? StringLatin1.equals(value, aString.value): StringUTF16.equals(value, aString.value);}}return false;}
Nach dem Login kopieren

Hinweis: Java8 Der Quellcode der equal()-Methode von Java11 unterscheidet sich von der equal()-Methode von JDK8

@HotSpotIntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {if (value.length == other.length) {int len = value.length >> 1;for (int i = 0; i <div></div>1.2. Beispielbeschreibung<p></p>Beispiel 1: <p></p><pre class="brush:php;toolbar:false">public boolean equals(Object anObject) {// 如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;}// 如果是String类型的实例if (anObject instanceof String) {////Object类型的对象强制转换为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
Was ist das Ausgabeergebnis? Die Funktion „equals“ der String-Klasse besteht darin, ob der Inhalt der String-Objekte gleich ist. Da sie alle „Hallo“ sind, ist das Ergebnis wahr. Beispiel 2:

new String("hello").equals("hello")
Nach dem Login kopieren
Was ist das Ausgabeergebnis?

= = Ob die vom Operator verglichenen Objektadressen gleich sind, = = Die linke Seite ist das im Heap erstellte Objekt und die rechte Seite ist das String-Konstanten-Pool-Objekt. Obwohl der Inhalt gleich ist, sind die Adressen nicht gleich Das Ergebnis ist falsch. Beispiel 3:

new String("hello") == "hello";
Nach dem Login kopieren
Ausgabeergebnis?
h und ello befinden sich beide im String-Konstantenpool. Wenn der Compiler also auf den +-Operator stößt, wird er automatisch auf „Hallo“ optimiert, damit das Ergebnis wahr ist

Beispiel 5:

new String("hello") == new String("hello");
Nach dem Login kopieren

Was ist das Ausgabeergebnis? ?
new String("hello") Bei der Ausführung wird zunächst ein Objekt im String-Konstantenpool erstellt und dann das Objekt im Heap erstellt. Beim Ausführen der intern()-Methode wird festgestellt, dass das Objekt „Hallo“ ist ' existiert bereits im String-Konstantenpool, gibt also direkt die Objektreferenz im String-Konstantenpool zurück und vergleicht sie dann mit dem String-'Hallo'-Vergleich im Konstantenpool, sodass das Ergebnis wahr ist

Eingehende Analyse von String.intern() hat die Gründe bereits vorgestellt

2. Vergleich anderer Methoden

Neben der .equals()-Methode und dem „==“-Operator gibt es noch einige andere Vergleichsmethoden, die verwendet werden können:

1. Methode Objects.equals(): Mit dieser statischen Methode kann verglichen werden, ob zwei Objekte gleich sind, und es ist nicht erforderlich, vor dem Aufruf festzustellen, ob das Objekt leer ist.

"hello" == "h"+"ello"
Nach dem Login kopieren

2. Die .contentEquals()-Methode der String-Klasse: Mit dieser Methode kann verglichen werden, ob eine Zeichenfolge einer beliebigen Zeichenfolge entspricht (z. B. StringBuffer, StringBuilder, String, CharSequence).

new String("hello").intern() == "hello"
Nach dem Login kopieren

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

Verwandte Etiketten:
Quelle:51cto.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage