ホームページ  >  記事  >  テクノロジー周辺機器  >  Javaにおけるequals()と==の違いと使用法

Javaにおけるequals()と==の違いと使用法

WBOY
WBOY転載
2024-03-07 15:28:11351ブラウズ

Java 開発には、一見単純なトピックがありますが、インターネット上には、equals() と == 演算子の違いに関するトピックや質問がたくさんあります

  • ==: 演算子は 2 つのオブジェクトのアドレスが等しいかどうかを比較するために使用されます
  • equals(): メソッドは 2 つのオブジェクトの内容が等しいかどうかを比較するために使用されます

今日の内容の紹介、所要時間は約 9 分です

Javaにおけるequals()と==の違いと使用法写真

違いをよりよく理解するために、見てみましょう例:

String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1.equals(str2)); // 输出 trueSystem.out.println(str1 == str2); // 输出 false

この例では、2 つの文字列の内容は同じですが、メモリ内のアドレスが異なります。したがって、.equals() メソッドを使用して内容を比較すると true が返されますが、「==」演算子を使用してアドレスを比較すると false

1 が返されます。

Java の基礎を学習したことのある人は、すべての Java クラスがデフォルトで Object クラスを継承することを知っているはずです。Object クラスには .equals() メソッドがあります。 can find .equals( from the code ) メソッドは、デフォルトで比較に == 演算子を使用します。サブクラスが equals() メソッドをオーバーライドしない場合は、 == 演算子と equals() メソッドを使用します。結果は正確に次のようになります。同じ - 2 つのオブジェクトのメモリ アドレスが等しいかどうかを比較するために使用されます。

しかし実際の状況は、多くのクラスがequals()メソッドをオーバーライドしているということです。これは、メモリアドレスの比較要件が厳密であり、実際のシナリオのすべてのニーズを満たしていないためです。たとえば、Stringクラス, 比較する場合、ほとんどの場合は内容が等しいかどうかを判断したいだけで、メモリアドレスが等しいかどうか(オブジェクトであるかどうか)を知りたいわけではありません。
Java 文字列定数プールの詳細な研究に関する記事では、Java 仮想マシンがメモリ使用率を最適化し、パフォーマンスを向上させるために、文字列に別の領域 (文字列定数プール) を割り当てることがわかりました。

new ではヒープ上に追加のメモリ領域の割り当てが必要になるため、new キーワードを使用する代わりに String s = "Hello" を使用して文字列オブジェクトを作成することをお勧めします。

1.1. String クラスの平等() メソッド

Jdk11 の String クラスの平等() メソッド

public boolean equals(Object obj) {return (this == obj);}

特記事項: Latin1 (ISO 8859-1 とも呼ばれる) と UTF-16 (Unicode 変換形式 16 ビット) は、2 つの異なる文字エンコード方式です。

Latin1 と UTF-16 は 2 つのエンコード方式ですが、違いはありません。 UTF-16のequals()メソッドを見てください
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;}

注: Java8とJava11のequals()メソッドのソースコードは異なります。 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. 例の説明<p></p>例 1:<div></div><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;}

出力結果は何ですか?

equals of String クラス このメソッドは、文字列オブジェクトの内容が等しいかどうかを比較します。すべて "Hello" であるため、結果は true になります。
例 2:

new String("hello").equals("hello")

出力結果は何ですか?

#== 演算子で比較したオブジェクトのアドレスが等しいかどうか == 左側はヒープに作成されたオブジェクト、右側は文字列定数プール オブジェクト。内容は等しいが、アドレスが等しくないため、結果は false

例 3:

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

出力結果は何ですか?

new から出力されるオブジェクトは完全に異なるメモリ アドレスである必要があるため、結果は false になります

例 4:

new String("hello") == new String("hello");
#出力は何ですかresult?

h と ello はどちらも文字列定数プールにあるため、コンパイラは自動的に hello に最適化されるため、結果は true

例 5:
"hello" == "h"+"ello"

出力結果は何ですか?

new String("hello") 実行中、オブジェクトはまず文字列定数プールに作成され、次にヒープに作成されます。 intern() メソッドを実行すると、文字列定数プールにオブジェクト 'hello' がすでに存在することが判明したため、直接戻ります。 文字列定数プールのオブジェクトが参照され、文字列定数プールの 'hello' と比較されます。結果は trueです。

String.intern() の詳細な分析でその理由がすでに紹介されています
2. 他の比較方法

に加えて。

1.Objects.equals() メソッド: この静的メソッドは、equals() メソッドと "== 演算子を使用できます。 2 つのオブジェクトが等しいかどうかを比較します。呼び出す前にオブジェクトが空かどうかを判断する必要はありません。

new String("hello").intern() == "hello"
    2. String クラスの .contentEquals() メソッド: このメソッドは、文字列と任意の文字シーケンス (StringBuffer など) を比較するために使用できます。 StringBuilder、String、CharSequence) は等しいです。
うわぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁん

以上がJavaにおけるequals()と==の違いと使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。