문서의 이전 판입니다!
public boolean equals([ClassName] other) { // 잘못된 equals!! } // 다음이 올바르다. 무조건 다음과 같이한다. public boolean equals(Object other) { ... }
equals가 사용하는 필드와 hashCode가 사용하는 필드를 동일하게 맞춰야 한다.HashSet.contains 등이 올바르게 작동하지 않게 된다. HashSet은 hashCode 기반으로 bucket을 결정한다. equals(Object) 호출시 true라면 두 객체의 hashCode()는 동일한 int 를 리턴해야 한다.hashCode는 equals에서 사용한 필드들만을 사용해야한다.equals, hashCode를 구현한 상태에서 해당 필드 값을 변경하면 동일 객체라도 hashCode가 바뀌게 된다.
equals는 null이 아닌 객체간에는 항상 동치 관계를 유지하게 구현해야만 한다.
* 반사성(reflexive) : null이 아닌 x에 대해 x.equals(x)는 항상 true여야 한다.
* 대칭성(symmetric) : null이 아닌 x, y에 대해, 오직 y.equals(x)가 true일 때만 x.equals(y)도 true여야 한다.
* 이행성(transitive) : null이 아닌 x,y,z에 대해,x.equals(y)가 true이고 y.equals(z)가 true이면 x.equals(z)도 true여야 한다.
* 일관성(consistent) : null이 아닌 x, y에 대해, 객체의 동등성 비교에 사용된 정보에 변경이 없다면 x.equals(y)를 여러번 호출해도 일관성있게 true를 반환하거나 일관성있게 false를 반환해야 한다.
* null이 아닌 값 x 에 대해 x.equals(null)은 항상 false를 반환해야 한다.
false가 될 가능성이 높은 잘못된 코딩이다.