37

看了ArrayList的java doc,发现ArrayList的初始容量是10。

 /**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
this(10);
}

我认为如果它是 2 的任何幂都是有意义的,但为什么是 10?

我还检查了 HashMap 的初始容量,它是 16,这是有道理的。

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;

/**
 * Constructs an empty <tt>HashMap</tt> with the default initial capacity
 * (16) and the default load factor (0.75).
 */
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}

数字 10 背后有什么具体原因吗?

4

7 回答 7

42

是简单的ArrayList增长数组。当尝试添加元素时,缓冲区大小超出了,它只是在增长。所以初始大小可以是任何正值。

1太少了。即使有一些元素,我们也会有一些调整大小的操作。

100 将是空间的损失。

所以,10是妥协。为什么是 10 而不是 12 或 8?第一个提示是,分析了典型的用例,这是性能损失和空间损失之间的最佳匹配。然而,我认为,看到 Sun 的原始代码,它没有被分析得如此深入,它是一个任意的“不太小,也不太大”的数字。

于 2012-05-29T07:45:23.773 回答
13

对于列表,容量为 2 的幂没有任何优势。事实上,任何特定的启动能力都没有真正的优势。它必须足够大,以避免在小列表的常见情况下进行多次调整大小步骤,并且必须足够小,以免在相同情况下将内存浪费在未使用的容量上。选择 10 可能仅仅是因为它在满足这些要求的正确范围内并且因为它是“圆形的”。

于 2012-05-29T07:41:30.610 回答
10

Vector,从 JDK 1.0 开始,默认初始容量为 10,因此ArrayList在 1.2 中引入它们时保持一致可能是有意义的。

于 2012-05-29T07:48:28.277 回答
5

完全随意的选择。

没有理由说明 2 的幂在这里更有意义。由于散列的工作方式,它在 HashMap 中是有意义的。事实上,它必须是二的幂(根据源中的评论)。

注意 java.util.Vector(ArrayList 的老大哥)也有 10 个。

于 2012-05-29T07:41:21.107 回答
1

对于默认的元素数量,10 可能是一个或多或少的任意数字。

于 2012-05-29T07:40:58.703 回答
0

除非代码中有注释,否则我们永远无法确定。然而,我想在某个时候,一位 Sun 工程师已经收集了有关 ArrayList 在大量实际应用程序中的使用情况的统计数据,并确定……凭经验……平均而言,这 10 个结果大致上是最好的。(这就是他们调整诸如优化器、字节码设计等之类的东西的方式。)

并且,其他人指出,使用大小为 2 的幂的大小没有计算优势(或劣势)ArrayList

于 2012-05-29T07:42:48.107 回答
0

ArrayList 只是一个可以自动增长的数组。

是的..默认大小是 10

而且我认为这个初始/默认值背后没有太多考虑。默认值 10 似乎不太大,也不太小。(这可能是原因)。如果超出数组的默认初始容量怎么办..?数组的下一个容量由 -

New capacity=(current capacity*3)/2+1
So next size would be (10*3)/2+1= 16
And next (16*3)/2+1= 25
And So on...
于 2018-08-01T06:16:59.267 回答