Java 为什么我们在HashMap和HashSet中使用equals()方法而不实现comparator接口?

Java 为什么我们在HashMap和HashSet中使用equals()方法而不实现comparator接口?,java,collections,Java,Collections,为什么我们在HashMap和HashSet中使用equals()方法而不实现comparator接口?。我在上述概念中看到了一些示例程序。但在没有比较器接口的情况下,他们使用的是equals()和hashcode()方法。我的问题是,我们能在没有比较器接口的情况下使用这些方法吗?我们还可以使用equals()和hashcode()以及compareTo()方法来实现可比较的接口吗?HashMap和HashSet关心比较键或元素是否相等-它们不关心排序,不像(比如TreeMap和TreeSet)。

为什么我们在HashMap和HashSet中使用equals()方法而不实现comparator接口?。我在上述概念中看到了一些示例程序。但在没有比较器接口的情况下,他们使用的是equals()和hashcode()方法。我的问题是,我们能在没有比较器接口的情况下使用这些方法吗?我们还可以使用equals()和hashcode()以及compareTo()方法来实现可比较的接口吗?

HashMap
HashSet
关心比较键或元素是否相等-它们不关心排序,不像(比如
TreeMap
TreeSet
)。这就是为什么他们使用
equals()
hashCode()


比较器都是关于排序的——完全可能有一个类,其中没有特定的顺序,但有相等的概念。例如,2D
类型没有特别自然的顺序(如果要为其定义比较器,可以执行Y-then-X或X-then-Y),但具有自然的相等操作。这意味着在
HashMap
中作为键或
HashSet

equals
hashCode
中的元素都可以查看对象是否表示相同的值。
Comparator
接口告诉您两件事情应该按什么顺序进行。它们不是同一件事。请看,让我来问一个反问:为什么您认为我们需要用于HashMap或HashSet的Comparator?我们需要实现它的目的是什么?实际上,
HashMap
在某些情况下可以回退到使用
Comparable
(OpenJDK实现)。@TomHawtin-tackline它不会回退到它,它可能在订购红黑树时使用Comparable作为优化的一部分,只有当铲斗完全倾斜时才会发生这种情况large@Michael我将称之为后退。应急计划在紧急情况下可能使用的替代计划。@TomHawtin tackline:我想这取决于它是用作实施细节还是改变可见的行为。例如,如果两个值在
x.equals(y)
下比较为相等,但
x.compareTo(y)
返回非零,则
HashMap
会将它们视为不同的键吗?(或者反过来说,
equals
返回false,但是
compareTo
返回0。)@JonSkeet是的,让我用正确的方法来处理这个问题。。。如果您的
等于
表示相同,但
比较
表示不同,则可能存在间歇性问题。无论如何,它计算出
BigDecimal
(1.0不
等于
1.00)正确失败。