如果我有一个由 T 个对象组成的 PriorityQueue,并且 T 有一个 compareTo() 方法并实现了可比较,但我的 PriorityQueue 也将比较器作为参数,那么我的 PriorityQueue 将寻找什么元素的顺序?
换句话说,哪一个决定了对象的优先级?compareTo() 方法还是提供的比较器?
如果我有一个由 T 个对象组成的 PriorityQueue,并且 T 有一个 compareTo() 方法并实现了可比较,但我的 PriorityQueue 也将比较器作为参数,那么我的 PriorityQueue 将寻找什么元素的顺序?
换句话说,哪一个决定了对象的优先级?compareTo() 方法还是提供的比较器?
对于标准 PriorityQueue,如果您使用 构造它Comparator<T>
,那么它将确定优先级。如果没有,那么Comparable<T>
将决定它。这在PriorityQueue API中有很好的描述
构造函数参数的文档comparator
指出
comparator
- 用于排序此优先级队列的比较器。如果为 null,则顺序取决于元素的自然顺序。
这意味着当comparator
指定 a 时,方法建立的自然顺序将compareTo
被忽略。
我正在阅读 Oracle 类实现的源代码PriorityQueue
,它检查是否正在使用 Comparator 并首先使用它。否则,它使用 Comparable 对象。
Comparable 定义集合中类的自然顺序,而 Comparator 允许您提供不同的顺序。如果您决定提供不同的比较器,它将覆盖自然顺序。通过不输入比较器,它将恢复到 compareTo 方法设置的自然顺序。