#このチュートリアルの動作環境: Windows7 システム、Java8 バージョン、DELL G3 コンピューター。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 つの使用例があります。
コードは次のとおりです:
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 内:
これは、p1 と p2 の内容が等しいかどうかを判断します。 Person は、equals() メソッドをオーバーライドし、この equals() は、p1 と p2 の内容が等しいかどうかを判断するために使用されるため、p1 と p2 の内容が等しいことが起こり、そのため、true が返されます。
これは、p1 と p2 が同じオブジェクトであるかどうかを判断するためです。それぞれ新しく作成された 2 つの Person オブジェクトであるため、false が返されます。
以上がJavaのequals()メソッドの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。