규칙

2013-11-26 5 views
5

이유는 무엇입니까하는 TreeSet에 대한 add() 방법 및 HashSet 상태에 대한 오라클 자바 API 문서 : 세트에는 E2가없는 경우규칙

요소 전자는 추가되는 경우 (e==null ? e2==null : e.equals(e2))

HashSet평등을 결정하기 위해 hashCode()를 사용하는 반면

그러나 TreeSetcompareTo()를 사용합니다. 둘 다 equals() 값을 무시합니다. 나는 문서가 정확하지 않다고 생각 하나 관례에 대한 나의 이해 또는 결함이있는 알고리즘입니까?

답변

2

TreeSet 설명서가 잘못되었습니다.

을 사용하므로 equals()을 사용하므로 HashSet이 잘못되었습니다. hashCode()이 아닌이 빠른 검색에만 사용됩니다.

+0

hashCode()가 항상 동일한 코드를 반환하도록 설정되어 있으면 add()의 동작이 equals()에 의존하는 것처럼 보입니다. 하지만 equals()가 항상 'true'를 반환하고 hashCode()를 재정의하지 않는 객체를 만들면 다른 객체에 따라 다르므로 add()가 여러 객체를 추가합니다. 따라서 add()의 동작은 문서에 명시된 것보다 더 복잡해 보입니다. 루이 (Louis)가 말했듯이 이러한 상황은 계약의 범위를 벗어나지 만 구현에 관심을 가졌습니다 (그것이 말한대로하지 않았기 때문에). 누구나 표준 사양이 있는지 여부를 아는 사람은 누구입니까? – user3038094

+0

@ user3038094 - HashMap 작동 방식을 읽는 것이 좋습니다. 'equals()'메서드가 항상 호출되지 않는 이유를 이해하게 될 것입니다. 관계없이 일반적으로 HashSet은 평등 테스트를 위해'equals()'를 사용합니다. – jtahlborn

+0

감사합니다. jtahlborn - 나는 당신의 충고에 따라 당신이 의미하는 바를 보았습니다. hashCode()가 다른 경우 알고리즘은 equals()를 평가하지 않고 hashCode()가 동일하면 equals() 만 사용합니다. 이것은 아마도 hashCode()가 equals()보다 더 빨리 평가되거나 hashCode()가 평가되어야한다는 사실과 관련이 있기 때문일 것입니다. 그래서 문서에서 말하는 것이 더 낫습니다 : e == null? e2 == null : e.hashCode() == e2.hashCode()? e.hashCode() == e2.hashCode() : e.equals (e2) == 0 – user3038094

1

TreeSet는 문서에서이 설명 : 올바르게 설정 인터페이스를 구현하는 경우 (명시적인 Comparator가 제공되고 있는지 여부) 세트에 의해 유지되는 순서 부가 equals와 일관성이 있어야

하는 것으로. equals와의 일관성에 대한 정확한 정의는 Comparable 또는 Comparator를 참조하십시오. Set 인터페이스는 equals 오퍼레이션의 관점에서 정의되고 있기 (위해) 때문에, TreeSet 인스턴스는 compareTo (또는 compare) 메소드를 사용해 모든 요소를 ​​비교합니다. 이 메소드에 의해 등가라고 보여지는 요소는, 세트의 관점에서 보면, 동등합니다. 집합의 동작은 순서가 equals와 일치하지 않는 경우에도 잘 정의됩니다. 그것은 단지 Set 인터페이스의 일반 계약을 따르지 못합니다.

HashSet의 경우 Set의 개체가 올바르게 구현되었음을 암시 적으로 예상합니다. hashCode()이 올바르게 구현되지 않은 경우 HashSet은 사양을 위반하지만 전달되는 개체는 아닙니다.

+0

"집합의 동작은 순서가 equals와 일치하지 않더라도 잘 정의되어 있습니다." 그러나이 동작은 문서에서 정의한대로가 아닙니다. 즉 궁금한 점입니다. 이것에 대한 문서가 구체적이지 않은가? 다음과 같이 말하면 더 좋습니다 : e == null? e2 == null : e.compareTo (e2) == 0) – user3038094