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