Pri*_*shi 35 java collections arraylist
我看到了ArrayList的java doc,发现ArrayList的初始容量是10.
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
Run Code Online (Sandbox Code Playgroud)
我认为如果它是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();
}
Run Code Online (Sandbox Code Playgroud)
10号后面有没有明确的原因?
小智 41
这ArrayList是一个简单的增长阵列.当尝试添加元素,并且超过缓冲区大小时,它只是在增长.所以初始大小可以是任何正值.
1会太少了.即使有一些元素,我们也会进行一些调整大小操作.
100将是一个空间的损失.
所以,10是妥协.为什么10而不是12或8?首先提示,分析了典型的用例,这是性能损失和空间丢失之间的最佳匹配.但是,我认为,看到太阳的原始代码,它没有被如此深入地分析,它是一个任意的"不太小,不太大"的数字.
Mic*_*rdt 13
对于列表,容量是2的幂是没有优势的.事实上,任何特定的起始能力都没有真正的优势.它必须足够大以避免针对小列表的常见情况的多个调整大小步骤,并且足够小以不在相同情况下在未使用的容量上浪费存储器.10可能只是因为它落在适当的范围内以满足这些要求并因为它是"圆形"而被选择.
Den*_*ote 10
Vector从JDK 1.0开始,默认初始容量为10,因此ArrayList在1.2中引入时可能保持一致.
完全随心所欲.
并且没有理由为什么2的幂在这里更有意义.它在HashMap中是有意义的,因为散列的工作原理.事实上,它必须是两个人的力量(根据来源中的评论).
请注意,java.util.Vector(它是ArrayList的哥哥)也有10个.