当我更改条目的键时,Java PriorityQueue是否会重新排列自身?
假设我有一个优先级队列当我更改条目的键时,Java PriorityQueue是否会重新排列自身?,java,priority-queue,Java,Priority Queue,假设我有一个优先级队列 class Node{ public int id; public int dist = Integer.MAX_VALUE; public Node(int id) { this.id = id; } } Queue<Node> q = new PriorityQueue<>((a, b) -> Integer.compare(a.dist, b.dist)); 队列的行为是什么?two会
class Node{
public int id;
public int dist = Integer.MAX_VALUE;
public Node(int id) { this.id = id; }
}
Queue<Node> q = new PriorityQueue<>((a, b) -> Integer.compare(a.dist, b.dist));
队列的行为是什么?two
会在现在之前出现吗
谢谢 Java API的不同实现可能表现不同。但是,对于OpenJDK:否。诸如
peek
之类的操作不会对集合重新排序:它们只返回已排序集合中的第一个值。因此,除非您使用队列的方法,否则无法知道顺序已更改
事实上,甚至调用add
(例如)也不会使用现有项:它假定现有项在将新项随机移动到队列中的正确位置时已排序
从openJDK实现中可以看到。@BeeOnRope,我不知道它如何更完整……为什么不运行代码并找出答案呢?不,它不会。队列不知道其中项目的属性或它们的更改。您需要删除、更新、插入。您的代码会导致未定义的行为。文档中明确指出,您不能这样做。@BoristheSpider除非您能提出一个应该发生什么的规范,是的。
Node one = new Node(1);
Node two = new Node(2);
one.dist = 1;
two.dist = 2;
q.offer(one);
q.offer(two);
two.dist = -1;