簡體   English   中英

為什么ArrayList 10的默認容量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM