Java에서 hashCode()와 equals()의 차이
글쓴이: smallhuman / 작성시간: 목, 2014/05/01 - 4:18오후
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode()
hashCode, toString, equals 메서드에 대해 보다가 궁금한 것이 생겨서요...
hashCode설명에 보면 'equals 메서드에서 false가 뜨더라도 같은 hashCode 값을 갖는 객체가 있을 수 있다' 대충 이런 식으로 적어놨는데
이런 게 가능한가요?!?!?!?!? 물론 설명에 보면 '사실 실제로는 객체가 다르면 hashCode도 다르다'라고 적어놓긴 했습니다만.;
혹시 equals로 false가 뜨는데 같은 hash값을 가지는 예제를 알 수 있을까요.
Forums:
명제1 : [a.hashCode() ==
명제1 : [a.hashCode() == b.hashCode()]
명제2 : [a.equals(b)]
명제2가 참이면 명제1은 반드시 참입니다.
이 규칙은 모든 클래스가 반드시 준수해야 합니다.
그 역은 성립할 수도 성립하지 않을 수도 성립하지 못할 수도 있습니다.
수학적으로 보자면, 객체의 경우의 수가 integer가 커버할 수 있는 수보다 많다면, 반드시 어떤 두 객체가 같은 integer를 hashCode를 가질 수 있겠지요. (비둘기집의 원리)
실질적으로는 여러 container의 효율은 이 hashCode를 얼마나 잘 정의하느냐에 따라 달라지구요. (HashMap, HashSet 등)
흠. 그렇게 많은 객체를 필요로하는 프로그램이
흠. 그렇게 많은 객체를 필요로하는 프로그램이 있으려나요 ^^;;
저는 그냥 hashCode()가 간단하게 포인터 값을 리턴하는 것으로 생각했는데 그건 아닌가보네요.
답변 감사합니다~ 궁금한 게 풀렸습니다!
객체가 적어도 일어날 수 있습니다.
결국 해시코드만으로 유일성을 판단하는 방법은 사용하면 안 된다는 것.
익명님이 말씀하신건 객체의 수가 인티저의 한계를 벗어났을 경우 "반드시" 겹치는 값이 나온다고 했을 뿐, 한계를 벗어나지 않았을 경우에는 안전하다고 한 것이 아닙니다.
유일성은 레퍼런스 자체로 판단해야 합니다. 다만 비교용도로 저장한 레퍼런스때문에 객체 해제가 안되는 불상사가 발생하지 않게 처리해야 하고 그게 귀찮아서(...) 가끔 해시코드에만 의존하는 예가 보이곤 하는 듯.
그럼 정작 해시코드는 어디에 쓰라는 건지 의문이 드실 수도 있는데, 동일 해시코드가 나오더라도 기존 값을 잃지 않고 누적 처리가 가능한 경우에는 사용해도 됩니다. 해시셋/맵 등 일부 컨테이너들이 이런 방법을 사용합니다.
또한 해시코드 생성에 말씀하신대로 내부 포인터를 이용할 수도 있습니다만 이 역시 보장된 것은 아닙니다.
--
으윽. 복잡하군요 ㅠ.ㅠ.... 답변 감사합니다.
으윽. 복잡하군요 ㅠ.ㅠ.... 답변 감사합니다.
댓글 달기