2009-09-24 8 views
17

TreeSet 콜렉션 및 hashCode 메소드에 대한 빠른 질문이 있습니다. 개체를 추가하기 전에 TreeSet이 있고 여기에 개체를 추가하려고합니다. contains 메서드를 사용하여 TreeSet에 있는지 확인합니다.Java - TreeSet 및 hashCode()

나는 hashCode 메소드의 내 구현을 사용하여 별개의 해시 코드, 아래의 예를 생산하고 각각이 별개의 개체가 :

public int hashCode() 
{ 
    int hash = 7; 
    hash = hash * 31 + anAttribute.hashCode(); 
    hash = hash * 31 + anotherAttribute.hashCode(); 
    hash = hash * 31 + yetAnotherAttribute.hashCode(); 
    return hash; 
} 
특정 실행에 대한 해시 코드

입니다 : 76126352과 76126353 (객체 만 하나의 속성에서 한 자리수만큼 다릅니다).

hashCodes가 다르더라도 contains 메소드는 이러한 객체에 대해 true를 반환합니다. 어떤 아이디어? 이것은 정말로 혼란스럽고 도움이 될 것입니다. 자바 doc로부터

답변

34

TreeSet은 hashCode을 전혀 사용하지 않습니다. compareTo 또는 생성자에 전달 된 Comparator 중 하나를 사용합니다. 이것은 contains와 같은 메소드에 의해 사용되어 집합 내의 객체를 찾습니다.

그래서 질문에 대한 답은 compareTo 메소드 나 Comparator가 정의되어있어 문제의 두 객체가 동일하다고 간주된다는 것입니다.

JavaDoc을 가입일

이 방법에 의해 동등한 것으로 간주

TreeSet의 인스턴스가 은 compareTo를 사용하여 모든 요소 비교를 수행 (또는 비교)하는 방법이므로 두 요소의 관점에서, 아르 세트는 동일합니다.

+0

또한 equals 메서드를 사용하므로 equals와 Comparator/compareTo가 일관성을 유지하는 것이 중요합니다. –

+6

javadocs에 따르면 그렇지 않습니다. – sepp2k

+2

"이것은 Set 인터페이스가 equals 연산으로 정의 되었기 때문에 TreeSet 인스턴스가 compareTo (또는 compare) 메소드를 사용하여 모든 요소 비교를 수행하기 때문에 가능합니다."(http://java.sun.com/ javase/6/docs/api/java/util/TreeSet.html) – Dirk

3

:

두 경우 개체는 동일한 정수 결과를 오브젝트에 대해서 hashCode 메소드를 호출 등호 (개체)에있어서, 에있어서 동일하다.

의미 : 해싱에 사용하는 개체가 동일하지 않습니다.

+1

hashCode 및 equals가 계약을 위반하지 않는 방식으로 정의되었다고 가정합니다. – sepp2k

+2

@ sepp2k 이것은 * 'hashCode()'에 대한'일반 계약 '입니다. 그래서 'must'라는 단어를 사용합니다. – EJP

0

당신은 그것은 동등한 계약을 설명하고 제대로 등호, 해시 코드, 및은 compareTo을 재정의하는 방법을 여호수아 블로흐의 "효과적인 자바"3 장을 읽을 필요가있다.

+0

온라인에서도 이용 가능 : http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – gustafc

+0

나는 gustafc의 의견을 upvote 할 준비가되었지만 링크가 끊어졌습니다. ( –

+0

Go this book. 여전히 밖으로 거기에. – duffymo

0

삽입 지점 (삽입 지점)으로 이동하는 동안 삽입()이 기본적으로 동일한 작업 (즉, 적절한 위치 검색)을 수행하기 때문에 포함되지 않았는지 확인할 필요가 없습니다. 오브젝트를 삽입 할 수없는 경우 (즉, 오브젝트가 이미 포함되어있는 경우), insert는 false를 반환합니다.

+0

아주 깨끗하고 간결한 API에 대한 그 하나의 예 (컬렉션 클래스의 대부분처럼). – helpermethod

관련 문제