Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのequals()メソッドとhashCode()メソッドの間のコントラクトは何ですか?


すべてのJavaオブジェクトには、2つの非常に重要なメソッド equals()があります およびhashCode() これらのメソッドは、特定の一般契約に従ってオーバーライドされるように設計されています。 。 オブジェクト classはすべてのクラスの親クラスであり、これら2つのメソッドのデフォルトの実装はすでに各クラスに存在します。ただし、要件に基づいてこれらのメソッドをオーバーライドできます。

hashCode()メソッド

public int hashCode()

このメソッドは整数を返します 値。オブジェクトのハッシュコード値と呼ばれます。すべてのオブジェクトは、作成時に一意の32ビットのsignedint値が割り当てられます。この値は、そのオブジェクトのハッシュコード値です。

hashCode()メソッドに関連する一般的なコントラクト

  • hashCode() オブジェクトに格納されている値が変更されない限り、メソッドは、このメソッドを呼び出すたびに、同じオブジェクトに対して同じ整数値を返す必要があります。
  • 2つのオブジェクトが等しい場合( equals()による メソッド)次に hashCode() メソッドは、両方のオブジェクトに対して同じ整数値を返す必要があります。
  • ただし、 hashCode()である必要はありません。 メソッドは、等しくないオブジェクトに対して個別の結果を返します( equals()による) メソッド)。

equals()メソッド

public boolean equals(Object obj)

equals() Objectクラスのメソッドは、オブジェクトの同等性をチェックし、それに応じて戻ります またはfalse 。 Objectクラスによって提供されるデフォルトの実装は、両方の参照が同じオブジェクトを参照しているかどうかに基づいて、オブジェクトの同等性をチェックします。オブジェクトの値や状態はチェックされません。ただし、このメソッドをオーバーライドして、オブジェクトの状態または値を比較するための独自の実装を提供できます。

equals()メソッドに関連する一般的なコントラクト

null以外の参照変数の場合、a、b、およびc

  • a.equals(a) 常にtrueを返す必要があります 。
  • a.equals(b) trueを返す必要があります b.equals(a)の場合のみ trueを返します。
  • a.equals(b)の場合 trueを返します およびb.equals(c) trueを返します 次にa.equals(c) trueを返す必要があります 。
  • a.equals(b)の複数の呼び出し 一貫してtrueを返す必要があります または一貫してfalseを返します オブジェクトの値がどちらのオブジェクトに対しても変更されていない場合。
  • a.equals(null) falseを返す必要があります 。

したがって、 hashCode()をオーバーライドする必要があります equals()をオーバーライドする場合のObjectクラスのメソッド メソッド。

public class MainClass {
   public static void main(String[] args) {
      MainClass mainClass = new MainClass();
      TestClass obj1 = new TestClass(1);
      TestClass obj2 = new TestClass(1);
      mainClass.test1(obj1, obj2);
      TestClass obj3 = new TestClass(1);
      TestClass obj4 = new TestClass(2);
      mainClass.test2(obj3, obj4);
   }
   public void test1(TestClass obj1, TestClass obj2) {
      if (obj1.equals(obj2)) {
         System.out.println("Object One and Object Two are equal");
      }
      else {
         System.out.println("Object One and Object Two are not equal");
      }
   }
   public void test2(TestClass obj3, TestClass obj4) {
      if (obj3.equals(obj4)) {
         System.out.println("Object Three and Object Four are equal");
      }
      else {
         System.out.println("Object Three and Object Four are not equal");
      }
   }
}
class TestClass {
   private int val;
   TestClass(int val) {
      this.val = val;
   }
   public int getValue() {
      return val;
   }
   @Override
   public boolean equals(Object o) {
      // null check
      if (o == null) {
         return false;
      }
      // this instance check
      if (this == o) {
         return true;
      }
      // instanceof Check and actual value check
      if ((o instanceof TestClass) && (((TestClass) o).getValue() == this.val)) {
         return true;
      }
       else {
         return false;
      }
   }
   @Override
   public int hashCode() {
      int result = 0;
      result = (int) (val / 11);
      return result;
   }
}

出力

Object One and Object Two are equal
Object Three and Object Four are not equal

  1. JREとJDKの違いは何ですか?

    JDK (Java Development Kit)には、JREを含むJavaアプリケーションを開発および実行するために必要なすべてのツールとライブラリが含まれています。 JRE Javaランタイム環境は、Javaプログラムの実行に必要なJVMおよびその他のライブラリを含むソフトウェアです。

  2. JavaとJavaScriptの違いは何ですか?

    Web開発者のJeremyKeithが2009年に述べたように、「JavaはJavaScriptに、ハムはハムスターになります」。そのアナロジーの正確さは議論の余地がありますが、その背後にある精神は確かです。JavaとJavaScriptは、共通の言語ルートを共有しているにもかかわらず、2つの非常に異なるプログラミング言語です。何年にもわたって、それらはもう少し重複するようになりましたが、JavaScriptは、Webサイトをインタラクティブにする主要なフロントエンド言語であり続け、Javaはサーバーサイドおよびアプリケーションプログラミングで引き続き人気があります。開発者を雇ったり、コーディ