在我看来,数组的最大优点是我们可以使用O(1)访问任何元素。但是只能从头部或尾部访问队列。
此外,PriorityBlockingQueue是一个有序集合,这意味着每个单独的添加操作都会导致所有较大(或较小)的元素移位。那太贵了。
所以我不明白为什么不使用链接列表。
答案 0 :(得分:3)
因为底层数据结构实际上是二进制堆,它通过数组最有效地实现,并且在添加和删除时提供 O(log(N))性能。 LinkedList
不可能像堆一样高效。
此外,PriorityBlockingQueue是一个有序集合,这意味着每个单独的添加操作都会导致所有较大(或较小)的元素移位。
不,它没赢。它将导致重新堆积操作,这比您描述的更有效。
答案 1 :(得分:3)
此外,PriorityBlockingQueue是一个有序集合,这意味着每个单独的添加操作都会导致所有较大(或较小)的元素移位。
你误解了PriorityBlockingQueue
的内部运作方式:它不会在整个阵列中向上或向下移动;这确实太贵了。相反,它使用名为heap的数据结构,该数据结构使用数组进行存储,但不适用" plain"索引到它。相反,它以树状方式存储项目,使O(log 2 n)插入和删除成为可能。
有关PriorityBlockingQueue
如何维护堆的详细信息,请参阅shiftDown
中的implementations和shiftUp
中的PriorityQueue.java
。