programing

기본 .equals 및 .hashCode는 내 클래스에서 어떻게 작동합니까?

sourcetip 2022. 9. 19. 22:25
반응형

기본 .equals 및 .hashCode는 내 클래스에서 어떻게 작동합니까?

나만의 수업이 있다고 하자.

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

여기에는 몇 가지 속성과 메서드가 있습니다.동등한 기능을 구현하지 않고 해시 코드를 구현하지 않습니다.

equals와 hashCode를 호출하면 기본 구현은 무엇입니까?오브젝트 클래스에서요?그리고 그것들은 무엇입니까?디폴트 동등성은 어떻게 동작합니까?기본 해시 코드는 어떻게 동작하며 무엇을 반환합니까?==는 동일한 개체를 참조하는지 확인하기만 하면 되기 때문에 간단하지만 equals() 및 hashCode() 메서드는 어떻습니까?

네, 기본 구현은 객체입니다(일반적으로 동일 및/또는 해시 코드를 재정의한 클래스에서 상속하는 경우 대신 해당 구현을 사용합니다).

매뉴얼에서 다음 항목을 참조하십시오.

equals

클래스 객체에 대해 동등한 메서드는 가능한 가장 식별 가능한 동등성 관계를 객체에 구현합니다. 즉, 비표준 기준 값 x 및 y에 대해 이 메서드는 x와 y가 동일한 객체를 참조하는 경우에만 true를 반환합니다(x == y의 값은 true).

hashCode

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

JVM 구현 중 하나에서 다음을 수행합니다.

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

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

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

에는 디폴트 실장이 있습니다.equals()그리고.hashCode()오브젝트에 있습니다.독자적인 실장을 실시하지 않는 경우는, 이러한 실장이 사용됩니다.위해서equals()즉, 이것은==비교: 객체가 완전히 동일한 경우에만 객체가 동일합니다.위해서hashCode()Javadoc에 대한 설명이 잘 되어 있습니다.

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

네, 에서Object클래스가 오브젝트를 암묵적으로 확장하기 때문에 class. equals단순 반품this == obj.hashCode구현이 네이티브입니다.추측입니다. 포인터를 오브젝트로 되돌립니다.

자체 구현을 제공하지 않으면 개체에서 파생된 구현이 사용됩니다.클래스 인스턴스를 에 넣을 계획이 아니라면 괜찮습니다.HashSet(hashCode()를 실제로 사용하는 컬렉션) 또는 객체의 동일성을 체크해야 하는 것(HashSet의 contains() 메서드).그렇지 않으면 잘못 작동하게 됩니다.

Apache Commons LangHashCodeBuilderEqualBuilder를 통해 이러한 메서드를 직접 구현할 수 있습니다.

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

이 디폴트 실장에서는 2개의 참조가 동일한 오브젝트를 참조하는 경우에만 동일합니다.마찬가지로 오브젝트에 의해 제공되는hashCode()의 디폴트 실장은 오브젝트의 메모리주소를 정수치에 매핑함으로써 도출됩니다.

단, 특정 벤더의 Java 버전에 대한 정확한 구현 세부사항을 확인하려면 소스(사용 가능한 경우)로 보는 것이 가장 좋습니다.

언급URL : https://stackoverflow.com/questions/4178997/how-default-equals-and-hashcode-will-work-for-my-classes

반응형