Java包含()与equals()不一致

Java包含()与equals()不一致,java,equals,contains,Java,Equals,Contains,我有一个自定义类,它覆盖了equals()和hashCode()方法。我将该类的实例存储在TreeSet中。我不明白为什么树.contains(someObject)返回true,而树.first().equals(someObject)返回false,如果树只有一个元素。实际上,您应该实现,但也应该覆盖等于两者都是必需的。 此外,您应该确保compareTo方法在equals将返回true时始终返回0。如果equals将返回false,则compareTo也应返回一个值!=0 如果您想改用ha

我有一个自定义类,它覆盖了
equals()
hashCode()
方法。我将该类的实例存储在
TreeSet
中。我不明白为什么
树.contains(someObject)
返回
true
,而
树.first().equals(someObject)
返回
false
,如果
只有一个元素。

实际上,您应该实现,但也应该覆盖
等于
两者都是必需的。

此外,您应该确保
compareTo
方法在
equals
将返回true时始终返回0。如果
equals
将返回false,则
compareTo
也应返回一个值!=0

如果您想改用hashCode,那么实现hashCode是必要的。因此,实施它可能也是一个好主意

编辑:


对于那些想知道:这个界面是用来当你想使用不同种类的排序时,不时。在这种情况下,您将创建一个充当分类器的附加类。然后这个类需要实现
比较器
接口。因此,在这种情况下,您不希望您的类实现它。

实际上您应该实现,但您也应该覆盖
等于
两者都是必需的。

此外,您应该确保
compareTo
方法在
equals
将返回true时始终返回0。如果
equals
将返回false,则
compareTo
也应返回一个值!=0

如果您想改用hashCode,那么实现hashCode是必要的。因此,实施它可能也是一个好主意

编辑:


对于那些想知道:这个界面是用来当你想使用不同种类的排序时,不时。在这种情况下,您将创建一个充当分类器的附加类。然后这个类需要实现
比较器
接口。因此,在这种情况下,您不希望您的类实现它。

实际上您应该实现,但您也应该覆盖
等于
两者都是必需的。

此外,您应该确保
compareTo
方法在
equals
将返回true时始终返回0。如果
equals
将返回false,则
compareTo
也应返回一个值!=0

如果您想改用hashCode,那么实现hashCode是必要的。因此,实施它可能也是一个好主意

编辑:


对于那些想知道:这个界面是用来当你想使用不同种类的排序时,不时。在这种情况下,您将创建一个充当分类器的附加类。然后这个类需要实现
比较器
接口。因此,在这种情况下,您不希望您的类实现它。

实际上您应该实现,但您也应该覆盖
等于
两者都是必需的。

此外,您应该确保
compareTo
方法在
equals
将返回true时始终返回0。如果
equals
将返回false,则
compareTo
也应返回一个值!=0

如果您想改用hashCode,那么实现hashCode是必要的。因此,实施它可能也是一个好主意

编辑:

对于那些想知道:这个界面是用来当你想使用不同种类的排序时,不时。在这种情况下,您将创建一个充当分类器的附加类。然后这个类需要实现
比较器
接口。因此,在这种情况下,您不希望您的类实现它。

根据文档:

Set接口是根据equals操作定义的,但是 TreeSet实例使用其compareTo执行所有元素比较 (或比较)方法,因此这两个元素被认为相等 从集合的角度来看,方法是相等的

如果在没有显式比较器的情况下实例化树集,则它希望插入的元素实现
Comparable
。似乎您还没有这样做。

根据以下文件:

Set接口是根据equals操作定义的,但是 TreeSet实例使用其compareTo执行所有元素比较 (或比较)方法,因此这两个元素被认为相等 从集合的角度来看,方法是相等的

如果在没有显式比较器的情况下实例化树集,则它希望插入的元素实现
Comparable
。似乎您还没有这样做。

根据以下文件:

Set接口是根据equals操作定义的,但是 TreeSet实例使用其compareTo执行所有元素比较 (或比较)方法,因此这两个元素被认为相等 从集合的角度来看,方法是相等的

如果在没有显式比较器的情况下实例化树集,则它希望插入的元素实现
Comparable
。似乎您还没有这样做。

根据以下文件:

Set接口是根据equals操作定义的,但是 TreeSet实例使用其compareTo执行所有元素比较 (或比较)方法,因此这两个元素被认为相等 从集合的角度来看,方法是相等的


如果在没有显式比较器的情况下实例化树集,则它希望插入的元素实现
Comparable
。看来你还没有这样做。

你能分享对象
equals
hashCode