자바 의 equals()방법 과 hashCode 방법 을 분석 합 니 다.
2923 단어 JAVA 잡담
1.equals()방법
1.Object.equals()방법 을 언제 덮어 써 야 합 니까?
원생 의 equals 방법:
public boolean equals(Object obj) {
return (this == obj);
}
코드 에서 알 수 있 듯 이 원생 의 equals 방법 은'=='을 사용 하여 비교 한 것 이다.자바 를 배 운 사람 은 모두 알 아야 한다.'='은 메모리 주 소 를 비교 하기 때문에 원생 의 equals 방법 은 자신 이 자신 과 비교 할 때 만 true 로 돌아 가 고 한 대상 이 같은 지 아 닌 지 를 엄 격 히 판단 하 는 방법 이다.따라서 자신 만 의'논리 적 상등'개념(대상 과 같은 개념 이 아니다)을 가지 고 있 고 초 류 가 equals()방법 을 덮어 기대 하 는 행 위 를 실현 하지 않 는 다 면 우 리 는 equals()방법 을 덮어 야 한다.예 를 들 어 두 대상 중의 id 가 같다 면 이 두 대상 은 같다 고 생각 합 니 다.
2.equals 방법 을 덮어 쓸 때 지 켜 야 할 일반적인 약속
자 반성
임의의 null 이 아 닌 인용 값 x,x.equals(x)는 true 로 돌아 가 야 합 니 다.
대칭 성
임의의 null 이 아 닌 인용 값 x,y 에 대해 y.equals(x)가 true 로 돌아 갈 때 x.equals(y)는 true 로 돌아 가 야 합 니 다.
일치 성
임의의 null 이 아 닌 인용 값 x,y 에 대해 서 는 equals 방법의 비교 작업 이 대상 에서 사용 하 는 정보 가 바 뀌 지 않 았 다 면 x.equals(y)를 여러 번 호출 하면 true 나 false 를 일치 하 게 되 돌려 야 합 니 다.
전달 성
임의의 null 이 아 닌 인용 값 x,y,z 에 대해 x.equals(y)가 true 로 돌아 가 고 y.equals(z)가 true 로 돌아 가면 x.equals(z)는 true 로 돌아 가 야 합 니 다.
2.hashCode()방법
원생 hashCode 방법:
public native int hashCode();
equals()방법 을 다시 쓴 이 유 를 대답 할 때 hashCode()방법 을 동시에 다시 써 야 합 니 다.먼저 hashCode()방법 이 Object 규범 에서 통용 되 는 약속 을 살 펴 보 겠 습 니 다.
4.567917.응용 운영 기간 에 대상 의 equals 방법 에 대한 비교 작업 에 사용 되 는 정보 가 수정 되 지 않 으 면 이 대상 의 equals 방법 을 여러 번 호출 하면 똑 같은 정수 로 일관 되 게 돌아 가 야 합 니 다.같은 프로그램의 여러 번 실행 과정 에서 equals 방법 을 실행 할 때마다 돌아 오 는 정수 가 일치 하지 않 을 수 있 습 니 다
4.567917.만약 에 두 대상 이 equals(Object)방법 을 사용 하여 비교 하 는 것 이 같 지 않다 면 이 두 대상 중의 임의의 대상 의 hashCode 방법 을 호출 하면 반드시 서로 다른 정수 결 과 를 만들어 야 하 는 것 은 아니다.서로 다른 대상 에 게 서로 다른 hash 코드 를 만 들 면 해시 표 의 성능 을 향상 시 킬 수 있 습 니 다(예 를 들 어 HashMap 에 데 이 터 를 추가 할 때 구체 적 으로 어느 통 에 추가 하 는 지 는(table.length-1)&hash 에 따라 계산 합 니 다)
따라서 상기 hashCode 통용 약정 에 따라 우 리 는 알 수 있 습 니 다.equals 방법 을 다시 썼 고 hashCode 방법 이 없 으 면 hashCode 통용 약정 의 두 번 째 제약 조건 을 위반 할 수 있 습 니 다.같은 대상 은 똑 같은 해시 코드 를 가 져 야 합 니 다.
클래스 의 equals 방법 에 따라 두 개의 전혀 다른 인 스 턴 스 는 논리 적 으로 같 을 수 있 지만 Object 류 의 hashCode 방법 에 따라 그들 은 공통점 이 없 는 대상 일 뿐이다.따라서 대상 의 hashCode 방법 은 두 번 째 약속 에 따라 요구 하 는 것 이 아니 라 무 작위 로 보 이 는 정수 두 개 를 되 돌려 줍 니 다.