사용자 도구

사이트 도구


java:equals_hashcode

문서의 이전 판입니다!


Java equals & hashCode

자주하는 equals & hashCode 실수 및 올바른 구현

잘못된 ''equals'' 메소드 시그너쳐

public boolean equals([ClassName] other) {
  // 잘못된 equals!!
}
 
// 다음이 올바르다. 무조건 다음과 같이한다.
public boolean equals(Object other) {
...
}

equals가 변경되면 hashCode도 변경해야한다

  • equals가 사용하는 필드와 hashCode가 사용하는 필드를 동일하게 맞춰야 한다.
  • 그렇지 않으면 HashSet.contains 등이 올바르게 작동하지 않게 된다. HashSet은 hashCode 기반으로 bucket을 결정한다.
  • hashCode 규약
    • 두 개의 객체가 equals(Object) 호출시 true라면 두 객체의 hashCode()는 동일한 int 를 리턴해야 한다.
    • hashCodeequals에서 사용한 필드들만을 사용해야한다.

Mutable(변경가능한) 필드에 대한 equals/hashCode 구현은 하면 안 된다

  • 변경가능한 필드에 대해 equals, hashCode를 구현한 상태에서 해당 필드 값을 변경하면 동일 객체라도 hashCode가 바뀌게 된다.
  • 이 상태로 필드 변경전에 HashSet에 값을 넣었다면, 필드 값을 변경한 후에는 해당 객체를 HashSet에서 찾을 수 없게 된다. hashCode로 bucket을 결정하는데 hashCode가 바뀌었기 때문이다.

다른 타입간의 equals 탐지

java/equals_hashcode.1498576808.txt.gz · 마지막으로 수정됨: 2017/06/27 23:50 저자 kwon37xi