当我更改条目的键时,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;