3

我想知道为什么Java 中 PriorityQueue的默认大小是11. 我查看了实现,它让我更加困惑。

优先级队列被实现为一个堆。使用此功能调整其容量:

/**
 * Increases the capacity of the array.
 *
 * @param minCapacity the desired minimum capacity
 */
private void grow(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    int oldCapacity = queue.length;
    // Double size if small; else grow by 50%
    int newCapacity = ((oldCapacity < 64)?
                       ((oldCapacity + 1) * 2):
                       ((oldCapacity / 2) * 3));
    if (newCapacity < 0) // overflow
        newCapacity = Integer.MAX_VALUE;
    if (newCapacity < minCapacity)
        newCapacity = minCapacity;
    queue = Arrays.copyOf(queue, newCapacity);
}

我不明白11容量的初始值。我认为容量应该永远是2级别的数量。任何澄清?

4

1 回答 1

3

11 可能是一个或多或少任意选择的数字,作为内存消耗(太大的数字会消耗太多的内存)和 CPU 消耗(太低的数字需要太多调整队列大小)之间的权衡)。他们可能对典型用例进行了基准测试,以选择这个数字和用于调整队列大小的策略。

于 2012-06-02T10:34:57.423 回答