我有一个包含覆盖equals()
和hashCode()
方法的自定义类。我将该类的实例存储在TreeSet
中。在tree.contains(someObject)
只有一个元素的情况下,我无法弄清楚为什么true
会返回tree.first().equals(someObject)
,而false
会返回tree
。
答案 0 :(得分:2)
实际上你应该实施Comparable
,但你也应该覆盖equals
。 两者都是必需的。
此外,当compareTo
返回true时,您应确保equals
方法始终返回0。如果equals
将返回false,那么compareTo
也应该返回一个值!= 0.
如果您想使用HashMap
,则必须实现hashCode。所以,实现它也是一个好主意。
修改强>
对于那些对Comparator
感到疑惑的人:当您想要不时使用不同类型的排序时,会使用此界面。在这种情况下,您将创建一个充当分拣机的附加类。然后该类需要实现Comparator
接口。因此,在这种情况下,您不希望您的班级实施它。
答案 1 :(得分:1)
根据TreeSet的文档:
Set接口是根据equals操作定义的,但是a TreeSet实例使用compareTo执行所有元素比较 (或比较)方法,因此两个被认为相等的元素 从集合的角度来看,方法是相等的。
如果在没有显式比较器的情况下实例化TreeSet,则期望插入的元素实现Comparable
。看来你还没有那样做。