Java util priorityQueue 实现
Posted
技术标签:
【中文标题】Java util priorityQueue 实现【英文标题】:Java util priorityQueue implementation 【发布时间】:2015-06-27 06:47:53 【问题描述】:下面是java.util.PriorityQueue(java 1.7)源码中我看不懂的注释。
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
为什么有些虚拟机会在数组中保留一些标题字?那是干什么用的?这些虚拟机到底是什么?
在这个cmets下面,这里是容量大于MAX_ARRAY_SIZE
时处理的函数
private void grow(int minCapacity)
int oldCapacity = queue.length;
// Double size if small; else grow by 50%
int newCapacity = oldCapacity + ((oldCapacity < 64) ?
(oldCapacity + 2) :
(oldCapacity >> 1));
// overflow-conscious code
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
queue = Arrays.copyOf(queue, newCapacity);
private static int hugeCapacity(int minCapacity)
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//why return Integer.MAX_VALUE ? Would this throw an exception in some certain VMs?
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
【问题讨论】:
【参考方案1】:在此上下文中的 VM 指的是 JVM(Java 虚拟机),即执行 Java 字节码的软件。
这个软件有几种不同的实现方式(今天最值得注意的是——Oracle 和 OpenJDK)。其中一些实现可能会出于内部目的(例如,跟踪垃圾收集)向数组添加一些额外的内存。由于 JDK 尝试尽可能通用,并在任何 JVM 上运行,因此它采取了预防措施,不允许您创建内部使用比 Integer.MAX_VALUE - 8
更长的数组的 PriorityQueue。
【讨论】:
我可以理解虚拟机以及将一些附加信息存储到数组中的目的。我无法理解的是在这个 cmets 之后,在 hugeCapacity
函数中,当 minCapacity > MAX_ARRAY_SIZE
时,他们将`newCapacity` 设置为 Integer.MAX_VALUE
我认为这与这个 cmets 有冲突。我将编辑问题以添加此代码。
64 位地址空间可以允许数组大于 Integer.MAX_VALUE 的项目数。所以 PriorityQueue 中的这种限制似乎是错误的。是仅限 PriorityQueue 还是所有 Java 数组的限制?
@SergeRogatch Java 语言规范不允许数组大于 Integer.MAX_VALUE 元素。字长与它无关。以上是关于Java util priorityQueue 实现的主要内容,如果未能解决你的问题,请参考以下文章
在“initialCapacity=n”的“java.util.PriorityQueue”中插入“n”个元素的时间复杂度
挑战程序设计竞赛(算法和数据结构)——10.5 Java 中对应C++ STL中的PriorityQueue类的使用
[20-05-23][Thinking in Java 39]Java Container 11 - PriorityQueue