logo

Java で 2 つのオブジェクトを比較する方法

Javaオブジェクト class は、すべての Java クラスのスーパークラスです。すべての Java クラスは、デフォルトで Object クラスを実装します。 Java オブジェクト クラスは、次の 2 つの重要なメソッドを提供します。 2つを比較する Javaのオブジェクト 、つまり 等しい() そして ハッシュコード() 方法。このセクションでは、その方法を学びます 等しい() そして ハッシュコード() メソッドは機能します。これに合わせて、私たちも学んでいきます Javaで2つのオブジェクトを比較する方法 適切な例とともに。

Java では、オブジェクトを比較するために Object クラスの 2 つのメソッドが提供されています。

  • Javaのequals()メソッド
  • Java hashCode() メソッド

Javaのequals()メソッド

等しい() Object クラスのメソッドは、2 つのオブジェクトの同等性を比較します。同じメモリ アドレスを共有する場合、2 つのオブジェクトは同等になります。

構文:

 public boolean equals(Object obj) 

このメソッドは、参照オブジェクトをパラメータとして解析します。オブジェクトが等しい場合は true を返し、そうでない場合は false を返します。

オブジェクトが別の指定されたオブジェクトと等しい場合もあり、その場合は、equals() メソッドが続きます。 等価関係 オブジェクトを比較します。

    再帰的:もし バツ は null 以外の参照です。 x.equals(x) true を返さなければなりません。対称:2 つの非 null 参照が バツ そして y、x.equals(y) 戻ります 真実 もし、そしてその場合に限り y.equals(x) 戻る 真実 。推移的:3 つの非 null 参照が x、y 、 そして z、x.equals(z) また戻ります 真実 もし x.equals(y ) そして y.equals(z) どちらも戻ります 真実 。一貫性のある:2 つの非 null 参照が バツ そして そして 、の複数の呼び出し x.equals(y) 常に true または false を返します。比較に使用される情報は提供されません。
  • null 以外の参照の場合 x、x.equals(null) falseを返します。

つまり、null 以外の参照については、次のようになります。 バツ そして そして 、両方の参照が同じオブジェクトを参照している場合にのみ true を返します。

覚えて: equals() メソッドをオーバーライドする場合は、hashCode() メソッドをオーバーライドする必要があります。オーバーライドは、等しいオブジェクトには等しいハッシュ コードが必要であるという hashCode() メソッドの規則に従います。

equals() メソッドの例

次の例では、 コンストラクタダブル そして 長さ クラスを作成し、それぞれのオブジェクトに格納されている引数として、対応する値を渡します。

その後、最初の println ステートメントで、equals() メソッドを呼び出し、オブジェクト x と y を比較するパラメーターとしてオブジェクト y を解析します。戻ります 間違い x は double 値を保持し、y は等しくない long 値を保持するためです。

同様に、2 番目の println ステートメントでは、equals() メソッドを呼び出し、Double クラスのコンストラクターと同じ値を解析しています。戻ります 真実 double クラスのオブジェクト、つまり x は、equals() メソッドに渡したものと同じ値を保持しているためです。

Javaで設定

ObjectComparisonExample.java

 public class ObjectComparisonExample { public static void main(String[] args) { //creating constructor of the Double class Double x = new Double(123.45555); //creating constructor of the Long class Long y = new Long(9887544); //invoking the equals() method System.out.println('Objects are not equal, hence it returns ' + x.equals(y)); System.out.println('Objects are equal, hence it returns ' + x.equals(123.45555)); } } 

出力:

 Objects are not equal, hence it returns false Objects are equal, hence it returns true 

==演算子とequals()メソッドの違い

ジャワ== 演算子は、2 つの参照が同一であるかどうかを比較します。一方、 等しい() メソッドは 2 つのオブジェクトを比較します。

オブジェクトは 等しい それらが同じ状態である場合 (通常は変数を比較する場合)。オブジェクトは 同一 彼らがクラスのアイデンティティを共有するとき。

たとえば、次のような式が挙げられます。 obj1==obj2 平等ではなく同一性をテストします。表現しながら obj1.equals(obj2) 平等を比較します。

Java hashCode() メソッド

Java では、ハッシュ コードは 32 ビットの符号付き整数値です。によって提供される一意の ID です。 JVM Java オブジェクトに。各 Java オブジェクトはハッシュ コードに関連付けられます。ハッシュ コードは、HashTable、HashSet などのハッシュ ベースのデータ構造によって管理されます。

覚えて: equals() メソッドをオーバーライドする場合は、hashCode() メソッドもオーバーライドする必要があります。

構文:

 public int hashCode() 

これは、インスタンスごとに一意のオブジェクトのランダムに生成されたハッシュ コード値を返します。ランダムに生成された値は、プログラムを数回実行する間に変更される可能性があります。

hashCode の一般的な規約は次のとおりです。

  • アプリケーションの実行中に hashCode() メソッドが複数回呼び出された場合、hashCode() メソッドは一貫して同じハッシュ コード (整数値) を返します。オブジェクトは変更しないでください。
  • equals() メソッドに従って 2 つのオブジェクトが等しい場合、これら 2 つのオブジェクトに対して hashCode() メソッドを呼び出すと、同じ整数値が生成される必要があります。
  • 2 つのオブジェクトが equals() メソッドに従って等しくない場合、これら 2 つのオブジェクトに対して hashCode() メソッドを呼び出して別個の整数値を生成する必要はありません。これは、両方のオブジェクトに対して同じハッシュ コードを生成できることを意味します。

hashCode()メソッドの例

次の例では、2 つのクラスを作成しました 従業員.java そして ハッシュコード例.java

Employee クラスでは、int 型の regno と String 型の name という 2 つのフィールドを定義しました。その後、Employee クラスのコンストラクターを作成し、これら 2 つのフィールドをパラメーターとして渡します。

オブジェクトの比較を実行するために、という名前の別のクラスを作成しました。 ハッシュコードの例 。このクラスでは、Employee クラスの 2 つのインスタンスを作成しました。 emp1 そして emp2 。その後、オブジェクトを使用して hashCode() メソッドを呼び出しました。ハッシュコード値を変数に格納しました ある そして b 、 それぞれ。

従業員.java

 public class Employee { private int regno; private String name; //constructor of Employee class public Employee(int regno, String name) { this.name = name; this.regno = regno; } public int getRegno() { return regno; } public void setRegno(int Regno) { this.regno = regno; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

ハッシュコード例.java

 public class HashcodeExample { public static void main(String[] args) { //creating two instances of the Employee class Employee emp1 = new Employee(918, 'Maria'); Employee emp2 = new Employee(918, 'Maria'); //invoking hashCode() method int a=emp1.hashCode(); int b=emp2.hashCode(); System.out.println('hashcode of emp1 = ' + a); System.out.println('hashcode of emp2 = ' + b); System.out.println('Comparing objects emp1 and emp2 = ' + emp1.equals(emp2)); } } 

出力:

 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

equals() メソッドのオーバーライド

独自の実装を提供したい場合は、次の方法で equals() メソッドをオーバーライドできます。

 //overriding equals() method @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; return this.getRegno() == ((Employee) obj). getRegno(); } 

上記のコード スニペットは、2 人の従業員が同じメモリ アドレスに格納されている場合、または同じ regno を持っている場合、それらの従業員が等しいことを示しています。上記のコード スニペットを使用してプログラム (HashCodeExample.java) を実行すると、次の出力が得られます。

出力:

 hashcode of emp1 = 2032578917 hashcode of emp2 = 1531485190 Comparing objects emp1 and emp2 = true