[英]In Java 8, why is the default capacity of ArrayList now zero?
[英]Why is the default capacity of ArrayList 10?
我看到了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号后面有没有明确的原因?
ArrayList
是一个简单的增长数组。 当尝试添加元素,并且超过缓冲区大小时,它只是在增长。 所以初始大小可以是任何正值。
1会太少了。 即使有一些元素,我们也会进行一些调整大小操作。
100将是一个空间的损失。
所以,10是妥协。 为什么10而不是12或8? 首先提示,分析了典型的用例,这是性能损失和空间丢失之间的最佳匹配。 但是,我认为,看到太阳的原始代码,它没有被如此深入地分析,它是一个任意的“不太小,不太大”的数字。
对于列表,容量是2的幂是没有优势的。 事实上,任何特定的起始能力都没有真正的优势。 它必须足够大以避免针对小列表的常见情况的多个调整大小步骤,并且足够小以不在相同情况下在未使用的容量上浪费存储器。 10可能只是因为它落在适当的范围内以满足这些要求并因为它是“圆形”而被选择。
来自JDK 1.0的Vector
的默认初始容量为10,因此当它们在1.2中引入ArrayList
时,它可能保持一致。
完全随心所欲。
并且没有理由为什么2的幂在这里更有意义。 它在HashMap中是有意义的,因为散列的工作原理。 事实上,它必须是两个人的力量(根据来源中的评论)。
请注意,java.util.Vector(它是ArrayList的哥哥)也有10个。
对于默认的元素数,10可能是或多或少的任意数。
除非代码中有评论,否则我们永远不会知道。 但是,我想,在某些时候,Sun工程师已经在大量实际应用程序中收集了有关ArrayList使用情况的统计数据,并且根据经验确定...... 10平均得出的结果大致相同。 (这就是他们如何调整这样的东西,优化器,字节码设计等等。)
并且,和其他人指出,对于ArrayList
的大小,使用2的幂的大小没有计算优势(或缺点)。
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...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.