问题1:
以下输出为1,2,3
Queue<Integer> q1 = new PriorityQueue<Integer>();
q1.add(1);
q1.add(3);
q1.add(2);
System.out.print(pq.poll());
System.out.print(pq.poll());
System.out.print(pq.poll());
以下输出为1,3,2
Queue<Integer> q2 = new LinkedList<Integer>();
q3.add(1);
q3.add(3);
q3.add(2);
System.out.print(q3.poll());
System.out.print(q3.poll());
System.out.print(q3.poll());
为什么呢?既然他们都在实现Queue接口但是有不同的行为?我认为无论实现类是什么,如果它们实现相同的接口,它的行为必须是相同的。
问题2:
假设我使用以下
定义一个类class process {
int exeTime;
int arrTime;
process(int, arr, int exe) {
arrTime=arr;
exeTime = exe;
}
}
在以下代码行中覆盖compare方法有什么影响?为什么?
PriorityQueue<process> pq2 = new PriorityQueue<process>(new Comparator<process>() {
@Override
public int compare(process p1, process p2) {
if (p1.exeTime == p2.exeTime)
return p1.arrTime - p2.arrTime;
return p1.exeTime - p2.exeTime;
}
});
答案 0 :(得分:2)
Queue
接口并不矛盾。 Javadocs for add
in Queue
并未声明任何特定订单:
如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此队列,成功时返回true,如果当前没有可用空间则抛出IllegalStateException。
Javadocs for poll
in Queue
可能表明它从队列的头部开始,但是add
并没有说出头部应该是什么元素。
检索并删除此队列的头部,如果此队列为空,则返回null。
由于Queue
没有指定任何特定的顺序,因此每个实现类都可以自行定义它。
Javadocs
for that constructor指定用于在Comparator
中订购元素的PriorityQueue
类。使用默认初始容量创建PriorityQueue,并根据指定的比较器对其元素进行排序。
答案 1 :(得分:2)
完全没有。阅读Queue
interface documentation:
队列通常(但不一定)以FIFO(先进先出)方式对元素进行排序。除了优先级队列之外,优先级队列根据提供的比较器对元素进行排序,或者元素&#39;自然排序和LIFO队列(或堆栈),它们对元素LIFO(后进先出)进行排序。无论使用什么顺序,队列的头部都是通过调用remove()或poll()来删除的元素。在FIFO队列中,所有新元素都插入队列的尾部。其他类型的队列可能使用不同的放置规则。每个Queue实现都必须指定其排序属性。
Queue
的实现可以使用它选择的任何顺序。
2)如果exeTime
中存在平局,则会先arrTime
排序,然后exeTime
排序。
答案 2 :(得分:2)
我认为无论实现类是什么,如果它们实现相同的接口,它的行为必须相同。
这不正确。所有实现所要做的就是满足接口的合同。对于Queue
接口,行为可以像堆栈(先进先出),就像传统队列(先进先出),或者返回基于其他系统的元素。
PriorityQueue
根据Comparator
给出的优先级返回元素。如果compare(a, b)
返回负整数,则a
的优先级高于b
。如果compare(a, b)
返回一个正整数,那就是另一种方式。如果compare(a, b)
返回0
,则a
和b
具有相同的优先级。