면접: 왜 hashCode () 와 equals () 방법 을 다시 써 야 합 니까?

2608 단어 JAVA
1. equals 분석 ()
//Object   equals()
public boolean equals(Object obj) {     
    return (this == obj);     
    } 

내 부 는 '= =' 을 사용 하여 같은 대상 을 가리 키 는 지 비교 합 니 다.따라서 equals 방법 을 덮어 쓰 지 않 을 때 equals 방법 과 = 의 비교 결 과 는 같 습 니 다.(링크: 자바 의 equals () 와 "= =" 의 차이 점)
2. 언제 equals 방법 을 덮어 써 야 합 니까?
우 리 는 그것들 이 같은 대상 을 가리 키 는 지 아 닌 논리 적 으로 같은 지 알 고 싶 을 때, 우 리 는 equals 방법 을 덮어 써 야 한다.
equals 방법 을 덮어 쓰 는 일반적인 약속:
1. 자 반성 null 이 아 닌 인용 값 에 대해 x. equals (x) = true
2. 대칭 성 은 null 이 아 닌 모든 인용 값 x, y, x. equals (y) = y. equals (x)
3. 전달 성  null 이 아 닌 인용 값 x, y, z, x. equals (y) = = true, y. equals (z) = = true, --- x. equals (z) = = true
4. 일치 성 null 이 아 닌 인용 값 x, y 에 대해 서 는 equals 의 비교 작업 이 대상 에서 사용 하 는 정보 가 바 뀌 지 않 으 면 x. equals (y) 를 여러 번 호출 하여 돌아 오 는 값 이 변 하지 않 습 니 다.
5. null 이 아 닌 인용 값 x, x. equals (null) 는 false 로 돌아 가 야 합 니 다.
equals () 방법 을 실현 하 는 작은 기술:
1. = = 연산 자 를 사용 하여 매개 변수 가 이 대상 의 인용 인지 확인 하고 true 로 직접 돌아 갑 니 다.
2. intance 연산 자 를 사용 하여 매개 변수 가 정확 한 유형 인지 확인 합 니 다.
3. 매개 변 수 를 정확 한 유형 으로 변환 합 니 다.
4. 이 클래스 의 모든 관건 도 메 인 에 대해 매개 변수 중의 도 메 인 이 이 대상 에 대응 하 는 도 메 인 과 일치 하 는 지 확인 합 니 다.일치 하지 않 을 가능성 이 가장 높 은 도 메 인 을 먼저 비교 합 니 다.
5. equals 방법 을 덮어 쓸 때 항상 hashCode 방법 을 덮어 씁 니 다.
6. equals 성명 의 Object 대상 을 다른 대상 으로 교체 하지 마 십시오.
3. 왜 equals 방법 을 덮어 쓸 때 항상 hashCode 방법 을 덮어 씁 니까?
이렇게 하지 않 으 면 Object. hashCode 의 일반적인 약속 을 위반 하여 해시 기반 의 모든 집합 (HashMap, HashSet, HashTable) 과 결합 하여 정상적으로 작 동 하지 못 하기 때문이다.
  • 응용 프로그램 이 실행 되 는 동안 equals 방법의 비교 작업 에 사용 되 는 정보 가 변 하지 않 으 면 같은 대상 에 대해 여러 번 호출 합 니 다. hashCode 방법 은 똑 같이 같은 정 수 를 되 돌려 야 합 니 다. 그러나 응용 프로그램의 여러 번 실행 중, 즉 다시 시작 한 후에 결 과 는 일치 하지 않 을 수 있 습 니 다.
  • 만약 에 두 대상 이 equals 에 따라 서로 같다 면 이 두 대상 이 hashCode 방법 으로 되 돌아 오 는 결 과 는 반드시 같 아야 한다.
  • 만약 에 두 대상 이 equals 비교 에 따라 같 지 않다 면 이 두 대상 이 hashCode 방법 으로 되 돌아 오 는 결 과 는 반드시 다 르 지 않 지만 서로 다른 대상 이 서로 다른 hasCode 를 만들어 산 목록 의 성능 을 향상 시 킬 수 있다.
  • hashCode 를 덮어 쓰 지 않 고 위반 하 는 관건 적 인 약속 은 제2 조 입 니 다. 같은 대상 은 똑 같은 hashCode 를 가 져 야 합 니 다.
  • 같은 대상 이 서로 다른 hashCode 를 가지 고 있다 면 대상 을 hashMap 에 넣 으 면 대상 은 다른 통 에 저 장 됩 니 다. get 에 갈 때 같은 대상 이지 만 생 성 된 hashCode 가 다 르 기 때문에 다른 통 에서 찾 을 수 있 습 니 다. 이때 그 대상 을 찾 을 수 없습니다.

  • 프로젝트 에서 HashMap 을 자주 사용 하기 때문에 면접 을 볼 때 기본적으로 이 질문 을 합 니 다.
  • hashCode 방법 을 다시 쓴 적 이 있 습 니까?
  • HashMap 을 사용 할 때 hashCode 와 equals 를 다시 쓰 는 방법 이 있 습 니까?어떻게 썼어 요?
  • 한 대상 의 hashcode 를 바 꿀 수 있 습 니까?
  • HashMap 의 '키' 부분 에 사용자 정의 대상 을 저장 하려 면 이 대상 에 자신의 equals 와 hashCode 방법 으로 Object 의 동명 방법 을 덮어 써 야 합 니 다.
  • 좋은 웹페이지 즐겨찾기