为什么ArrayList 10的默认容量是?
我看到ArrayList中的Java文档,发现ArrayList中的初始容量为10为什么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后面是否有任何指定的原因?
该ArrayList
是简单的增长阵列。当试图添加元素时,超过缓冲区大小,它只是增长。所以初始大小可以是任何正值。
1会太少。即使有一些元素,我们也会进行一些调整操作。
100将是空间的损失。
所以,10是妥协。为什么10而不是12或8?首先,我们分析了典型的用例,这是性能损失和空间损失之间的最佳匹配。不过,我认为,看到太阳的原始代码,它没有被深入分析,它是一个任意的“不小,不太大”的数字。
10对于默认的元素数可能是一个或多或少的任意数字。
我不认为太阳开发者已经足够疯狂地使用任何随机数作为默认数字而没有太多想法。他们必须想到一些有用和有效的方案。 –
完全随心所欲的选择。
而且没有任何理由为什么2次幂在这里更有意义。它在哈希映射中很有意义,因为哈希是如何工作的。实际上,它必须是的两个幂(根据源中的评论)。
注意java.util.Vector中(这是ArrayList中的哥哥)也具有10
是的,它也有。 ArrayList的容量也有可能是原因。但问题是,为什么vector的初始容量是10? –
有关列表,有在具有容量为二的幂没有优势。事实上,在任何具体的启动能力方面都没有真正的优势。它必须足够大以避免小列表常见情况下的多个调整大小步骤,并且足够小以免在相同情况下浪费未使用容量的内存。 10的选择可能仅仅是因为它落在正确的范围内以满足这些要求,因为它是“圆”的。
即使它的权力为2,对于任何特定的容量也可能没有真正的优势。但是,如果太阳开发者已经做了足够的大量场景分析以找出任何数量,他们至少应该共享它,可能是不是在java文档中,而是在任何官方博客。因此,opersource社区中的每个人都有一个想法,而其他程序员可以表达自己的观点,以使该初始容量数更接近实际开发用例。 –
@Priyank Doshi:你可能正在推翻这个...... – Thilo
@Priyank Doshi:理想的初始容量会在应用程序之间有所不同,所以大量场景中的平均值实际上并不会非常有用 - 确切的值是极不可能的对于大多数应用程序来说很重要,但对于那些重要的应用程序而言,您会希望为特定应用程序使用最佳值,而不是一些平均值。 –
除非在代码中有评论,否则我们绝对不会知道。然而,我想在某种程度上,Sun工程师已经收集了大量实际应用中ArrayList使用情况的统计数据,并且根据经验确定... 10平均得到了最好的结果。 (这就是他们如何调整像这样的东西,优化器,字节码设计等等。)
而且,和其他人指出,使用两个幂的大小没有计算优势(或缺点)大小为ArrayList
。
Vector
,来自JDK 1.0的默认初始容量为10,因此在1.2中引入ArrayList
时可能保持一致。
不会。这是一个不兼容的变化。规范Javadoc说默认容量是10,所以他们不能只是改变它。 – Thilo
@PriyankDoshi我的意思是,他们可能希望ArrayList与Vector保持一致,因为它们密切相关。不提及其他集合实现。 –
>>>如果它会是2_的任何数量的话,为什么会这样呢? –
我认为它可以追溯到cs中的主导生命形式,它似乎有两个每个都有5个数字的操纵器。在计算初期用于计数的那些。所以他们更喜欢各种事物的10次方。 –
10是数组列表的初始容量不是大小。初始大小始终为0. – BOSS