이유는 무엇입니까하는 TreeSet
에 대한 add()
방법 및 HashSet
상태에 대한 오라클 자바 API 문서 : 세트에는 E2가없는 경우규칙
요소 전자는 추가되는 경우
(e==null ? e2==null : e.equals(e2))
HashSet
이 평등을 결정하기 위해hashCode()
를 사용하는 반면
그러나 TreeSet
는 compareTo()
를 사용합니다. 둘 다 equals()
값을 무시합니다. 나는 문서가 정확하지 않다고 생각 하나 관례에 대한 나의 이해 또는 결함이있는 알고리즘입니까?
hashCode()가 항상 동일한 코드를 반환하도록 설정되어 있으면 add()의 동작이 equals()에 의존하는 것처럼 보입니다. 하지만 equals()가 항상 'true'를 반환하고 hashCode()를 재정의하지 않는 객체를 만들면 다른 객체에 따라 다르므로 add()가 여러 객체를 추가합니다. 따라서 add()의 동작은 문서에 명시된 것보다 더 복잡해 보입니다. 루이 (Louis)가 말했듯이 이러한 상황은 계약의 범위를 벗어나지 만 구현에 관심을 가졌습니다 (그것이 말한대로하지 않았기 때문에). 누구나 표준 사양이 있는지 여부를 아는 사람은 누구입니까? – user3038094
@ user3038094 - HashMap 작동 방식을 읽는 것이 좋습니다. 'equals()'메서드가 항상 호출되지 않는 이유를 이해하게 될 것입니다. 관계없이 일반적으로 HashSet은 평등 테스트를 위해'equals()'를 사용합니다. – jtahlborn
감사합니다. 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