Java contains() 不符合 equals()
Java contains() not in accordance with equals()
我有一个自定义 class,其中覆盖了 equals()
和 hashCode()
方法。我将 class 的实例存储在 TreeSet
中。我不明白为什么 tree.contains(someObject)
returns true
,而 tree.first().equals(someObject)
returns false
,在 tree
有的情况下只有一个元素。
实际上您应该实施Comparable
,但您还应该覆盖equals
。 两者都是必需的。
此外,您应该确保 compareTo
方法在 equals
会 return 为真时始终 returns 0。如果 equals
会 return false,那么 compareTo
也应该 return 值 != 0.
如果您想改用 HashMap
,则必须实施 hashCode。因此,实现它可能也是一个好主意。
编辑:
对于那些想知道Comparator
的人:这个接口是当你想不时使用不同种类的排序时使用的。在这种情况下,您可以创建一个额外的 class 作为分类器。这个class然后需要实现Comparator
接口。所以在这种情况下,您不希望 class 实现它。
根据 TreeSet 的文档:
The Set interface is defined in terms of the equals operation, but a
TreeSet instance performs all element comparisons using its compareTo
(or compare) method, so two elements that are deemed equal by this
method are, from the standpoint of the set, equal.
如果您在没有显式比较器的情况下实例化 TreeSet,它期望插入的元素实现 Comparable
。看来你还没有这样做。
我有一个自定义 class,其中覆盖了 equals()
和 hashCode()
方法。我将 class 的实例存储在 TreeSet
中。我不明白为什么 tree.contains(someObject)
returns true
,而 tree.first().equals(someObject)
returns false
,在 tree
有的情况下只有一个元素。
实际上您应该实施Comparable
,但您还应该覆盖equals
。 两者都是必需的。
此外,您应该确保 compareTo
方法在 equals
会 return 为真时始终 returns 0。如果 equals
会 return false,那么 compareTo
也应该 return 值 != 0.
如果您想改用 HashMap
,则必须实施 hashCode。因此,实现它可能也是一个好主意。
编辑:
对于那些想知道Comparator
的人:这个接口是当你想不时使用不同种类的排序时使用的。在这种情况下,您可以创建一个额外的 class 作为分类器。这个class然后需要实现Comparator
接口。所以在这种情况下,您不希望 class 实现它。
根据 TreeSet 的文档:
The Set interface is defined in terms of the equals operation, but a TreeSet instance performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the set, equal.
如果您在没有显式比较器的情况下实例化 TreeSet,它期望插入的元素实现 Comparable
。看来你还没有这样做。