Javaのequals()メソッドの使い方
Java では、equals() メソッドは、あるオブジェクトが別のオブジェクトと等しいかどうかを検出するために使用されます (構文「Object.equals(Object2)」)。このメソッドは、2 つのオブジェクトが同じ参照を持つかどうかを判断します。 2 つのオブジェクトは同じ参照を持っており、それらは等しくなければなりません。 equals() メソッドは、基本データ型の変数を操作できません。
#java の等しい () メソッドは、オブジェクトが等しいかどうかを決定します。
equals メソッドは、1 つのオブジェクトが等しいかどうかを検出するために使用されます。別のオブジェクト。注:equals メソッドは、基本データ型の変数には作用できませんObject クラスでは、このメソッドは 2 つのオブジェクトが同じ参照を持つかどうかを判断します。2 つのオブジェクトが同じ参照を持つ場合、それらは等しい必要があります。 。
この観点からすると、これをデフォルトの操作として使用するのが合理的です。ただし、ほとんどのクラスでは、この判断は意味がありません。たとえば、この方法で 2 つの PrintStream を比較することはまったく意味がありません。ただし、多くの場合、2 つのオブジェクトの状態が等しいことを検出する必要があり、2 つのオブジェクトの状態が等しい場合、2 つのオブジェクトは等しいとみなされます。したがって、カスタム クラスでは等しい比較をオーバーライドする必要があります。
以下は、完璧なequals()メソッドを記述するための提案です:
(1) 明示的なパラメータはotherObjectという名前であり、後でotherという変数に変換する必要があります
(2) this と otherObject が同じオブジェクトを参照しているかどうかを確認します。
if(this==otherObject) return true;
このステートメントは単なる最適化です。実際、これはよく取られる形です。この方程式の計算は、クラス内のフィールドを 1 つずつ比較するよりもはるかに低コストであるためです。
(3) otherObject が null かどうかを確認し、null の場合は false を返します。このテストは非常に必要です。
if(otherObject==null) return false;
(4) this と otherObject を比較して、同じクラスに属しているかどうかを確認します。各サブクラスで等しいのセマンティクスが変化する場合は、getClass() を使用してそれを検出し、ターゲット クラスとして使用します
if(getClass()!=otherObject.getClass()) return false;
すべてのサブクラスが同じセマンティクスを持つ場合は、instanceof を使用して
if(!(otherObject instanceof ClassName)) return false;
(5) otherObject を対応する型の変数に変換します:
ClassName other=(ClassName)otherObject;
(6) 次に、次の作業を開始します。比較する必要があるすべてのフィールドが比較されます。 == を使用して基本タイプのフィールドを比較し、equals を使用してオブジェクトフィールドを比較します。すべてのフィールドが一致する場合は true を返し、それ以外の場合は false を返します;
return field1==other.field1&&field2.equals(other.field2)
equals がサブクラスで再定義されている場合は、super.equals(other) の呼び出しを含める必要があります。テストが失敗した場合、平等は不可能です。スーパークラス内のフィールドが等しい場合、サブクラス内のインスタンス フィールドが比較されます。
配列型フィールドの場合、静的な Arrays.equals メソッドを使用して、対応する要素が等しいかどうかを確認できます。
いくつかの文字列比較の例を見てみましょう:
String a = "abc"; String b = "abc"; String c = new String("abc"); String d = new String("abc"); System.out.println(a == b); // true 因为JAVA中字符串常量是共享的,只有一个拷贝 System.out.println(a == c); // false a和c属于2个不同的对象 System.out.println(a.equals(c)); // true 由于String对象的equals方法比较的是对象中的值,所以返回true。(和Object的equals方法不同) System.out.println(c==d); // false c和d虽然对象内的值相同,但属于2个不同的对象,所以不相等 System.out.println(c.equals(d)); // true
簡単に言うと、文字列定数を比較する場合、equals は、equals と同じ結果を返します。文字列オブジェクトの値を比較したいとします。
equals の使用例を見てみましょう:
package chapter05.EqualsTest; import java.util.*; public class EqualsTest { public static void main(String[] args) { Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15); Employee alice2 = alice1; // reference the same object Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15); Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1); System.out.println("alice1 == alice2: " + (alice1 == alice2)); System.out.println("alice1 == alice3: " + (alice1 == alice3)); System.out.println("alice1.equals(alice3): " + (alice1.equals(alice3))); System.out.println("alice1.equals(bob): " + (alice1.equals(bob))); System.out.println(bob.toString()); } } class Employee { public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month, day); hireDay = calendar.getTime(); } public String getName() { return name; } public double getSalary() { return salary; } public Date getHireDay() { return hireDay; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } @Override public boolean equals(Object otherObject) { // a quick test to see if the objects are identical if (this == otherObject) return true; // must return false if the explicit parameter is null if (otherObject == null) return false; // if the classed don't match,they can't be equal if (getClass() != otherObject.getClass()) return false; // now we know otherObject is a non-null Employee Employee other = (Employee) otherObject; // test whether the fields hava identical values return name.equals(other.name) && salary == other.salary && hireDay.equals(other.hireDay); } @Override public int hashCode() { return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13 * hireDay.hashCode(); } @Override public String toString() { return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; } private String name; private double salary; private Date hireDay; } class Manager extends Employee { public Manager(String n, double s, int year, int month, int day) { super(n, s, year, month, day); bouns = 0; } @Override public double getSalary() { double baseSalary = super.getSalary(); return baseSalary + bouns; } public void setBouns(double b) { bouns = b; } @Override public boolean equals(Object otherObject) { if (!super.equals(otherObject)) return false; Manager other = (Manager) otherObject; // super equals checked that this and other belong to the same class return bouns == other.bouns; } @Override public int hashCode() { return super.hashCode() + 17 * new Double(bouns).hashCode(); } @Override public String toString() { return super.toString() + "[bouns=" + bouns + "]"; } private double bouns; }
equals() と == の違いは何ですか?
#== : その機能は、2 つのオブジェクトのアドレスが等しいかどうかを判断することです。つまり、2 つのオブジェクトが同じオブジェクトであるかどうかを判断します。
equals(): その機能は、2 つのオブジェクトが等しいかどうかを判断することでもあります。ただし、一般に 2 つの使用例があります。
- ケース 1、クラスは、equals() メソッドをカバーしません。次に、equals() を使用してこのクラスの 2 つのオブジェクトを比較することは、「==」を使用して 2 つのオブジェクトを比較することと同等です。
- ケース 2、クラスは、equals() メソッドをオーバーライドします。一般に、equals() メソッドをオーバーライドして 2 つのオブジェクトの内容が等しいことを確認します。内容が等しい場合は true が返されます (つまり、2 つのオブジェクトは等しいとみなされます)。
- 以下では、例を通してそれらの違いを比較します。
コードは次のとおりです:
import java.util.*; import java.lang.Comparable; /** * @desc equals()的测试程序。 */ public class EqualsTest3{ public static void main(String[] args) { // 新建2个相同内容的Person对象, // 再用equals比较它们是否相等 Person p1 = new Person("eee", 100); Person p2 = new Person("eee", 100); System.out.printf("p1.equals(p2) : %s\n", p1.equals(p2)); System.out.printf("p1==p2 : %s\n", p1==p2); } /** * @desc Person类。 */ private static class Person { int age; String name; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " - " +age; } /** * @desc 覆盖equals方法 */ @Override public boolean equals(Object obj){ if(obj == null){ return false; } //如果是同一个对象返回true,反之返回false if(this == obj){ return true; } //判断是否类型相同 if(this.getClass() != obj.getClass()){ return false; } Person person = (Person)obj; return name.equals(person.name) && age==person.age; } } }
実行結果:
p1.equals(p2) : true p1==p2 : false
EqualsTest3.java 内:
- (1)
- p1.equals(p2)
これは、p1 と p2 の内容が等しいかどうかを判断します。 Person は、equals() メソッドをオーバーライドし、この equals() は、p1 と p2 の内容が等しいかどうかを判断するために使用されるため、p1 と p2 の内容が等しいことが起こり、そのため、true が返されます。
(2) - p1==p2
これは、p1 と p2 が同じオブジェクトであるかどうかを判断するためです。それぞれ新しく作成された 2 つの Person オブジェクトであるため、false が返されます。
プログラミング関連の知識について詳しくは、
以上がJavaのequals()メソッドの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです
