Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 equals()와 hashCode() 메소드 간의 계약은 무엇입니까?

<시간/>

모든 Java 객체에는 equals() 두 가지 매우 중요한 메소드가 있습니다. 및 hashCode() 이러한 메서드는 특정 일반 계약에 따라 재정의되도록 설계되었습니다. . 개체 class는 모든 클래스의 부모 클래스이고 이 두 메서드의 기본 구현은 이미 각 클래스에 있습니다. 그러나 요구 사항에 따라 이러한 메서드를 재정의할 수 있습니다.

hashCode() 메소드

public int hashCode()

이 메서드는 정수를 반환합니다. 객체의 해시 코드 값이라고 하는 값입니다. 모든 객체는 생성 시 고유한 32비트 부호 있는 int 값이 할당됩니다. 이 값은 해당 개체의 해시 코드 값입니다.

hashCode() 메소드와 관련된 일반 계약

  • hashCode() 메서드는 개체에 저장된 값이 수정되지 않는 한 이 메서드를 호출할 때마다 동일한 개체에 대해 동일한 정수 값을 반환해야 합니다.
  • 두 객체가 동일한 경우(equals()에 따라 메소드) 다음 hashCode() 메서드는 두 개체에 대해 동일한 정수 값을 반환해야 합니다.
  • 하지만 hashCode() 메소드는 같지 않은 객체에 대해 고유한 결과를 반환합니다(equals()에 따라 방법).

equals() 메소드

public boolean equals(Object obj)

같음() Object 클래스의 메소드는 객체의 평등을 확인하고 그에 따라 반환 사실 또는 거짓 . Object 클래스에서 제공하는 기본 구현은 두 참조가 동일한 개체를 참조하는 경우 기준에 따라 개체의 동등성을 확인합니다. 개체의 값이나 상태를 확인하지 않습니다. 그러나 이 메서드를 재정의하여 개체의 상태 또는 값을 비교하는 자체 구현을 제공할 수 있습니다.

equal() 메서드와 관련된 일반 계약

null이 아닌 참조 변수 a, b 및 c의 경우

  • a.equals(a) 항상 true를 반환해야 합니다. .
  • a.equals(b) true를 반환해야 합니다. b.equals(a)인 경우에만 true를 반환합니다.
  • a.equals(b)인 경우 반환 및 b.equals(c) 반환 그런 다음 a.equals(c) true를 반환해야 합니다. .
  • a.equals(b) 다중 호출 일관되게 true를 반환해야 합니다. 또는 지속적으로 false를 반환합니다. 두 개체에 대해 개체 값이 수정되지 않은 경우.
  • a.equals(null) 거짓을 반환해야 합니다. .

따라서 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