hashCode와 Java의 equals 메소드 간의 관계
나는
equals
자바에서 메서드 를 재정의 하는 동안 메서드 를 재정의 해야한다고 많은 곳에서 읽었
hashCode
습니다. 그렇지 않으면 "계약 위반"입니다.그러나 지금까지 나는 hashCode 메서드가 아닌 equals 메서드 만 재정의하면 아무런 문제가 발생하지 않았습니다.계약은 무엇입니까? 그리고 계약을 위반할 때 왜 문제가 발생하지 않습니까? hashCode 메서드를 재정의하지 않은 경우 어떤 경우에 문제가 발생합니까?
문제는 요소의 단일성이
.equals()
및 에 따라 계산되는 컬렉션 (
.hashCode()
예 :
HashMap
.이름에서 알 수 있듯이 해시 테이블에 의존하고 해시 버킷은 객체의
.hashCode()
.두 개의 객체가
.equals()
있지만 해시 코드가 다른 경우 잃게됩니다!여기서 중요한 계약 부분 은 다음과 같습니다 . 반드시 동일한
객체를 .equals()
가져야합니다.hashCode()
.이 모든 내용
있습니다. 그리고
당신이 그것을해야한다고
. 충분했다.
문서에 따르면 hashCode의 기본 구현은 모든 객체에 대해 다른 정수를 반환합니다.
합리적으로 실용적인만큼, Object 클래스에 의해 정의 된 hashCode 메서드는 고유 한 개체에 대해 고유 한 정수를 반환합니다. (이것은 일반적으로 객체의 내부 주소를 정수로 변환하여 구현되지만JavaTM 프로그래밍 언어 에서는이 구현 기술이 필요하지 않습니다.)
그러나 언젠가는 동일한 의미를 가진 다른 객체에 대해 해시 코드가 동일하기를 원합니다. 예를 들면
Student s1 = new Student("John", 18);
Student s2 = new Student("John", 18);
s1.hashCode() != s2.hashCode(); // With the default implementation of hashCode
이러한 종류의 문제는 HashTable, HashSet와 같은 컬렉션 프레임 워크에서 해시 데이터 구조를 사용하면 발생합니다.
특히 HashSet과 같은 컬렉션을 사용하면 요소가 중복되어 Set 계약을 위반하게됩니다.
예, 재정의해야합니다. 을 재정의해야한다고 생각하는 경우 재정의
equals()
해야
hashCode()
하며 그 반대의 경우도 마찬가지입니다.
의 일반 계약 은 다음과 같습니다.
- Java 응용 프로그램을 실행하는 동안 동일한 객체에서 두 번 이상 호출 될 때마다 hashCode 메소드는 객체의 동등 비교에 사용 된 정보가 수정되지 않는 한 동일한 정수를 일관되게 반환해야합니다. 이 정수는 응용 프로그램의 한 실행에서 동일한 응용 프로그램의 다른 실행까지 일관성을 유지하지 않아도됩니다.
equals (Object) 메소드에 따라 두 오브젝트가 동일한 경우 두 오브젝트 각각에서 hashCode 메소드를 호출하면 동일한 정수 결과가 생성되어야합니다.
equals (java.lang.Object) 메소드에 따라 두 객체가 같지 않은 경우 두 객체 각각에 대해 hashCode 메소드를 호출하면 고유 한 정수 결과가 생성되어야하는 것은 아닙니다. 그러나 프로그래머는 같지 않은 개체에 대해 고유 한 정수 결과를 생성하면 해시 테이블의 성능이 향상 될 수 있음을 알고 있어야합니다.
JavaDoc 참조
에서
가 말한다 :
두 개의 물체가에 따라 동일한 경우에있어서, 그 호출
equals(Object)
두 객체의 각각에있어서
hashCode
같은 정수 결과를 생성한다
.
(나에 의해 강조).클래스가이 계약을 위반
equals()
하지 않고 재정의 만하는 경우
hashCode()
.이것은
메소드 의 JavaDoc에서도 언급됩니다 .
일반적으로이 메서드가 재정의 될 때마다 메서드 를 재정의해야한다는 점에 유의하십시오. 메서드에 대한 일반 계약을 유지하려면
hashCode
동일한 개체가 동일한 해시 코드를 가져야한다고 명시합니다.
hashCode
계약은 경우이다
obj1.equals(obj2)
다음
obj1.hashCode() == obj2.hashCode()
지도는 주로 항목의 키를 비교합니다 hashCode 메소드를 사용하는 한,이, 성능상의 이유로 주로.
계약은 두 개체가 같으면 동일한 해시 코드를 가져야하며 두 개체가 같지 않으면 동일한 해시 코드를 가질 수도 있고 가지지 않을 수도 있습니다.객체를 HashMap (joachim-sauer의 주석 후 편집)에서 키로 사용하면 문제가 발생하기 시작합니다. 계약은 당신에게 강요된 것이 아니라 지침입니다.
한 번 봐 가지고
Hashtables
,
Hashmaps
,
HashSets
등을. 그들은 모두 해시 된 키를 키로 저장합니다. 호출 할 때
get(Object key)
매개 변수의 해시가 생성되고 주어진 해시에서 조회됩니다.덮어 쓰지 않고
hashCode()
키의 인스턴스가 변경된 경우 (예 : 전혀 중요하지 않은 간단한 문자열)
hashCode()
은 동일한 객체에 대해 2 개의 다른 해시 코드를 생성하여
map.get()
.참고 URL :
https://stackoverflow.com/questions/17027777/relationship-between-hashcode-and-equals-method-in-java
'Programming' 카테고리의 다른 글
Vim : 검색 히트 및 빠른 수정 선택의 강조 색상을 변경하는 방법 (0) | 2020.08.07 |
---|---|
URL : @이있는 사용자 이름 (0) | 2020.08.07 |
빠른 순열-> 숫자-> 순열 매핑 알고리즘 (0) | 2020.08.07 |
여러 줄 편집은 어떻게하나요? (0) | 2020.08.07 |
실행중인 AsyncTask를 취소하는 이상적인 방법 (0) | 2020.08.07 |