PriorityQueue in Java not deterministic?(Java中的PriorityQueue不是确定性的吗?)
本文介绍了Java中的PriorityQueue不是确定性的吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我运行以下优先级队列测试时:
class Run {
public static void main(String[] args) {
PriorityQueue<Entry> q = new PriorityQueue<>(8, Collections.reverseOrder(new Comparator<Entry>() {
@Override
public int compare(Entry o1, Entry o2) {
return Integer.compare(o1.getValue(), o2.getValue());
}
}));
q.offer(new Entry(100));
q.offer(new Entry(0));
q.offer(new Entry(1));
q.offer(new Entry(-1));
q.offer(new Entry(0));
q.offer(new Entry(1));
q.offer(new Entry(-100));
q.offer(new Entry(100));
while (q.peek() != null) {
System.out.println(q.poll());
}
}
private static class Entry {
private static int GLOBAL_ID = 0;
private final int value, id;
public Entry(int value) {
this.value = value;
id = GLOBAL_ID++;
}
public int getValue() {
return value;
}
@Override
public String toString() {
return "Entry[" + id + ", value = " + value + ']';
}
}
}
我得到以下结果:
Entry[0, value = 100]
Entry[7, value = 100]
Entry[2, value = 1]
Entry[5, value = 1]
Entry[4, value = 0]
Entry[1, value = 0]
Entry[3, value = -1]
Entry[6, value = -100]
我希望以与输入相同的顺序输出相等的元素,因此当条目0在条目7之前提供时,它也会在轮询7之前被轮询。但是为什么条目4突然在1之前被轮询?是错误的Comparator还是PriorityQueue不能保证确定性行为?
推荐答案
它是非确定性的。
来自documentation for PriorityQueue
如果多个元素的值最小,则头元素是 那些元素--纽带被任意打破。
这篇关于Java中的PriorityQueue不是确定性的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Java中的PriorityQueue不是确定性的吗?
猜你喜欢
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
