为什么ArrayList 10的默认容量?

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可能只是因为它落在适当的范围内以满足这些要求并因为它是"圆形"而被选择.

  • @Priyank Doshi:理想的初始容量在应用程序之间会有所不同,因此大量场景的平均值实际上并不是非常有用 - 对于大多数应用程序而言,确切的值极不可能重要,但对于那些重要的应用程序来说,您将希望使用该特定应用程序的最佳值,而不是某些平均值. (3认同)
  • @PriyankDoshi:答案几乎肯定是值得大惊小怪.10或多或少足够小,以至于如果它过高估计并不重要,但足够大以至于较大的`ArrayList'会相对较快地调整大小; 担心细节,如确切的容量只是矫枉过正. (2认同)

Den*_*ote 10

Vector从JDK 1.0开始,默认初始容量为10,因此ArrayList在1.2中引入时可能保持一致.

  • @PriyankDoshi我的意思是他们可能希望ArrayList与Vector保持一致,因为它们密切相关.不是指其他集合实现. (3认同)

Thi*_*ilo 5

完全随心所欲.

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

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