为什么ArrayList 10的默认容量?

时间:2012-05-29 07:37:12

标签: java collections arraylist

我看到了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后面是否有任何指明原因?

7 个答案:

答案 0 :(得分:40)

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

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

100将失去空间。

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

答案 1 :(得分:13)

对于列表,容量是2的幂是没有优势的。事实上,任何特定的起始能力都没有真正的优势。它必须足够大以避免针对小列表的常见情况的多个调整大小步骤,并且足够小以不在相同情况下在未使用的容量上浪费存储器。 10可能只是因为它落在适当的范围内以满足这些要求并且因为它是“圆形”而被选择。

答案 2 :(得分:10)

来自JDK 1.0的

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

答案 3 :(得分:5)

完全随心所欲的选择。

并且没有理由为什么2的幂在这里更有意义。它在HashMap中是有意义的,因为散列的工作原理。事实上,必须是2的幂(根据来源中的评论)。

请注意,java.util.Vector(也是ArrayList的哥哥)也有10个。

答案 4 :(得分:1)

对于默认的元素数,

10可能是一个或多或少的任意数字。

答案 5 :(得分:0)

除非代码中有评论,否则我们永远不会确定。但是,我想,在某些时候,Sun工程师已经在大量实际应用程序中收集了有关ArrayList使用情况的统计数据,并且根据经验确定...... 10平均得出的结果大致相同。 (这就是他们如何调整这样的事情,优化器,字节码设计等等。)

并且,和其他人指出,对于ArrayList的大小,使用2的幂的大小没有计算优势(或缺点)。

答案 6 :(得分: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...