자바 의 equals 와 hashcode 방법 을 어떻게 복사 합 니까?

3737 단어 자바
이 글 은 번역 이 라 고 할 수 있 습 니 다.
          equals 와 hashCode 는 자바 의 한 대상 의 두 가지 기본 방법 과 core 자바 의 중요 한 구성 부분 입 니 다.Equals 는 대상 의 상등 성 을 비교 하 는 데 사용 되 며,hashcode 는 해당 대상 의 정수 형 인 코딩 을 생 성 하 는 데 사용 된다.Equals 화해시키다 hashCode 는 core 자바 에서 광범 위 하 게 응용 되 고 있 습 니 다.예 를 들 어 hashmap 에 데 이 터 를 삽입 하고 되 찾 습 니 다.
Equals 방법 은 다음 과 같은 규칙 을 따른다.
(1)자 반성.한 대상 은 반드시 그 자신 과 같 아야 한다.
(2)  대칭 성.하면,만약,만약... 그럼 b.equals(a) true 여야 합 니 다.
(3)  전달 성.하면,만약,만약... a.equals(b)는 true 이 고 b.equals(c) 그럼 c.equals(a) true 여야 합 니 다.
(4)  일치 성필드 의 값 이 바 뀌 지 않 는 한 equals()방법 을 여러 번 호출 하면 같은 결 과 를 되 돌려 야 합 니 다.
(5)  Null 비교.모든 대상 과 null 을 비교 할 때 false 로 돌아 가 야 하 며,NullPointer Exception 결과 가 나 올 수 없습니다.
equals 와 hashCode 의 관계
Equals()와 hashcode()는 다음 과 같은 규칙 을 준수 해 야 합 니 다.
(1)         만약 두 대상 이 equals()방법 을 실행 하 는 것 이 같다 면 hashcode()방법 을 실행 하 는 결과 도 반드시 같 아야 한다.
(2)         만약 두 대상 이 equals()방법 을 실행 하 는 것 이 같 지 않다 면 hashcode()방법 을 실행 하 는 결 과 는 같은 페이지 에서 같 지 않 을 수 있 습 니 다.
equals 방법 을 다시 쓰 는 절차
이것 은 대부분의 자바 프로그래머 들 이 equals 방법 을 다시 쓰 는 표준 방법 입 니 다.
(1)  이 검 사 를 하 다.this 라면 true 로 돌아 갑 니 다.
(2)  null 검 사 를 하 다.null 이면 false 로 돌아 갑 니 다.
(3) 인 스 턴 트 오 브 검 사 를 하 다.하면,만약,만약... false 로 돌아 가면 equals 방법 은 false 로 돌아 갑 니 다.연 구 를 좀 한 후에 인 스 턴 스 of 를 getClass()방법 으로 대체 할 수 있다 는 것 을 알 게 되 었 다. 인 스 턴 트 오 브 하위 클래스 를 검사 할 때 도 true 로 돌아 갑 니 다.그래서 상업 논리 가 필요 할 때 엄격 한 상관 관 계 는 아니다.만약 당신 의 클래스 가 변 하지 않 는 클래스 라면,클래스 가 그것 을 계승 할 수 없다 면,instanceof 를 사용 하 세 요. 시의 적절 하 다.그래서 인 스 턴 트 오 브 대신 사용 할 수 있 습 니 다. :
if((obj == null) || (obj.getClass() != this.getClass()))
        return false;

(4)  대상 형식 변환.
(5)  수치 형 속성 으로 모든 속성 값 을 비교 하기 시작 합 니 다.수치 형 속성 이 가장 빠 르 고 검사 와 결합 할 때 단락 작업 을 사용 할 수 있 기 때 문 입 니 다.첫 번 째 속성 이 일치 하지 않 으 면 나머지 속성 과 일치 하지 않 고 false 로 돌아 갈 수 있 습 니 다.모든 속성 이 equals 방법 을 호출 하기 전에 null 검 사 를 해 야 합 니 다.재 귀 equals 검사 에서 NullPointer Exception 이 나타 나 지 않도록 해 야 합 니 다.
equlas 방법 을 복사 하 는 코드 샘플
복사
equals 에서 흔히 볼 수 있 는 오류
(1)  다시 쓰 지 않 고 equals 방법 을 다시 불 러 왔 습 니 다.
이것 은 내 가 본 덮어 쓰기 equals 방법 에서 가장 흔히 볼 수 있 는 잘못 이다.equasl 의 문법 은 Public boolean equals(Object obj)이지 만 많은 사람들 이 본의 아니 게 equals 방법 을 다시 불 러 왔 습 니 다. public boolean equals(Person obj)。이 오 류 는 정적 연결 로 인해 매우 알 아차 리 기 어렵다.
(2)  두 번 째 오 류 는 equals 방법 을 복사 할 때 구성원 변 수 를 null 검 사 를 하지 않 았 고 결국 equals 방법 을 호출 할 때 발생 한 것 입 니 다. NullPointerException。정확 한 방법 은:
firstname == guest.firstname || (firstname != null && firstname.equals(guest.firstname)));
(3)  equals()방법 만 덮어 쓰 고 hashCode 방법 은 덮어 쓰 지 않 습 니 다.equals 와 hashCode 를 동시에 복사 해 야 합 니 다.그렇지 않 으 면 이 대상 은 HashMap 에서 key 가 될 수 없습니다.HashMap 은 이 두 가지 방법 에 의존 하기 때 문 입 니 다.
(4)      마지막 오 류 는 equals 방법 을 복사 할 때 equals 방법 과 copare To()의 일치 성 을 유지 하지 않 은 것 입 니 다.이것 은 정상 적 인 요구 가 아니 라 set 의 약속 에 따라 중복 되 지 않도록 하 는 것 입 니 다.SortedSet 예 를 들 어 TreeSet 은 compare To 방법 으로 두 대상 을 비교 합 니 다.예 를 들 어 문자열 입 니 다.compare To 방법 과 equals 방법 이 일치 하지 않 으 면 TreeSet 은 중복 을 허용 하여 Set 이 중복 할 수 없 는 약속 을 손상 시 킵 니 다.더 배우 고 싶 으 면 Things to remember whileoverriding compareTo in Java
equals 방법 을 쓸 때 팁 5 개
1)대부분의 IDE,예 를 들 어 NetBeans,Eclipse,IntelliJ IDEA 는 equals 와 hashCode 를 생 성 하 는 방법 을 지원 합 니 다.In Eclipse do the right click->source->generate 에서 hashCode() and equals().
2)클래스 에 유일한 비 즈 니스 키 가 있다 면 equals 방법 에서 이 키 필드 를 비교 하면 모든 필드 를 비교 하지 않 아 도 됩 니 다.예 를 들 어'id'는 모든 Person 의 유일한 것 이 므 로 id 만 비교 하면 두 Person 이 같은 지 아 닌 지 를 감별 할 수 있다.
3)hashCode 방법 을 복사 할 때 사용 하 는 모든 필드 가 equals 방법 에서 동일 한 지 확인 해 야 합 니 다.
4)String 과 포장 류,예 를 들 어 Integer,Float 와 Double 은 equals 방법 을 덮어 써 야 하고 StringBuffer 는 필요 하지 않 습 니 다.
5)가능 하 다 면 final 을 통 해 필드 를 바 꿀 수 없 도록 노력 해 야 한다.Equals 방법 은 가 변 필드 보다 가 변 필드 가 안전 합 니 다.

좋은 웹페이지 즐겨찾기