[java] 기본 .equals 및 .hashCode가 내 수업에서 어떻게 작동합니까?

나만의 수업이 있다고 해

public class MyObj { /* ... */ }

몇 가지 속성과 방법이 있습니다. equals를 구현하지 않고 hashCode를 구현하지 않습니다.

equals와 hashCode를 호출하면 기본 구현은 무엇입니까? Object 클래스에서? 그리고 그들은 무엇입니까? 기본값은 어떻게 작동합니까? 기본 hashCode는 어떻게 작동하며 무엇을 반환합니까? == 동일한 객체를 참조하는지 확인하므로 쉽습니다. 그러나 equals () 및 hashCode () 메서드는 어떻습니까?



답변

예, 기본 구현은 Object입니다 (일반적으로 말하면 equals 및 / 또는 hashCode를 재정의 한 클래스에서 상속하는 경우 대신 해당 구현을 사용합니다).

문서에서 :

equals

Object 클래스에 대한 equals 메소드는 객체에 대해 가능한 가장 구별되는 등가 관계를 구현합니다. 즉, null이 아닌 참조 값 x 및 y에 대해이 메서드는 x와 y가 동일한 객체를 참조하는 경우에만 true를 반환합니다 (x == y는 true 값을 가짐).

hashCode

합리적으로 실용적인만큼 Object 클래스에 의해 정의 된 hashCode 메서드는 고유 한 개체에 대해 고유 한 정수를 반환합니다. (이것은 일반적으로 객체의 내부 주소를 정수로 변환하여 구현되지만 JavaTM 프로그래밍 언어에서는이 구현 기술이 필요하지 않습니다.)


답변

에서 ObjectJVM을 구현 중 하나 :

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

두 경우 모두 해당 객체의 메모리 주소를 비교하는 것입니다.


답변

Object 에는 equals()및의 기본 구현이 있습니다 hashCode(). 자체 구현을 제공하지 않으면 해당 구현이 사용됩니다. 의 경우 equals()이것은 ==비교를 의미 합니다. 객체는 정확히 동일한 객체 인 경우에만 동일합니다. 들어 hashCode()자바 독은 좋은 설명이있다.

자세한 내용은 효과적인 Java, 3 장 (pdf), 항목 8을 참조하십시오.


답변

예, Object클래스가 암시 적으로 Object를 확장하므로 클래스 에서 . equals단순히 반환합니다 this == obj. hashCode구현은 기본입니다. 추측 일뿐입니다. 객체에 대한 포인터를 반환합니다.


답변

자체 구현을 제공하지 않으면 Object에서 파생 된 구현이 사용됩니다. 클래스 인스턴스를 HashSet (실제로 hashCode ()를 사용하는 모든 컬렉션) 또는 객체의 동등성을 확인해야하는 항목 (예 : HashSet의 contains () 메서드)에 넣을 계획이 아니라면 괜찮습니다. 그렇지 않으면 그것이 당신이 요구하는 것이라면 잘못 작동합니다.

이러한 방법 덕분에 자신의 구현을 제공 할 매우 쉽습니다 HashCodeBuilderEqualsBuilder 에서 아파치 코 몬즈 랭 .


답변

IBM의 developerworks 는 다음과 같이 말합니다.

이 기본 구현에서 두 참조는 정확히 동일한 객체를 참조하는 경우에만 동일합니다. 마찬가지로 Object에서 제공하는 hashCode ()의 기본 구현은 객체의 메모리 주소를 정수 값에 매핑하여 파생됩니다.

그러나 특정 공급 업체의 Java 버전에 대한 정확한 구현 세부 정보를 확인하려면 소스로 보는 것이 가장 좋습니다 (사용 가능한 경우).


답변