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 サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

如何在Java14中使用Records类自动生成equals()和hashCode()方法在Java编程中,我们经常需要为我们的类编写equals()和hashCode()方法。这两个方法在处理对象的相等性和哈希码时非常重要。为了简化这个过程,Java14引入了一个新的Records类。Records类提供了一种简化编写equals()和hashCode

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

WebStorm Mac版
便利なJavaScript開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ホットトピック



