Java: 优先队列初始化

Java: PriorityQueue initializations

我试图理解启动优先级队列的以下行:

PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[1] - a[1]);

与文档中的构造函数部分相比, https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

我不知道它使用的是哪个构造函数。有人可以分享一下想法吗?

此外,是否有文档可以更好地 explain/define 语法 (a, b) -> b[1] - a[1] ...虽然我能猜到它的意思。

非常感谢!

您对 PriorityQueue 的构造使用了 1.7 中尚不存在的构造函数,这是您链接的 Java 文档的版本。

它使用为 Java 1.8 添加的 constructor that takes a Comparator,它与您提供的 lambda 表达式相匹配。

Creates a PriorityQueue with the default initial capacity and whose elements are ordered according to the specified comparator.

Since:

1.8

Lambda expressions 是在 Java 1.8 中引入的。在这里,基本上你有 2 个参数和表达式匹配到 functional 接口 --Comparator.

因为 Java 8,there's a new constructor 有一个 Comparator 作为参数:

public PriorityQueue(Comparator<? super E> comparator)

因此使用 lambda 的初始化是有效的 Java 8+ 代码。

在优先级队列中,您基本上会放置用户定义的对象,因此优先级队列会询问您如何对这些对象进行排序(因为优先级队列就像堆数据结构——min/max 堆)所以我们给它一个比较器,它有一个比较方法,理想地用 ((a, b) -> b[1] - a[1]) 表示,这个方法给出 +ve, -ve 或基于 b > a , b 的零结果< a 或 b = a。它根据这个结果决定是否应该按升序或降序排列元素。

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/PriorityQueue.java