2013-08-06 71 views
20

我愛HashSet的<>()同時初始化這與默認的構造函數中使用這個期待:爲什麼初始化HashSet <>(0)爲零?

Set<Users> users = new HashSet<>(); 

現在,我的自動豆創作者(JBoss的工具)初始化爲:

Set<Users> users = new HashSet<>(0); 

爲什麼爲零?該API告訴我這是的初始容量,但將其歸零的優勢是什麼?這是建議嗎?

回答

21

default initial capacity is 16,所以通過傳入0,你可以節省幾個字節的內存,如果你最終沒有放入任何東西的話。

除此之外沒有真正的優勢;當你傳遞0時,該集合的容量爲1,並且只要添加了一些內容就必須調整大小。

+0

@PeterLawrey最小也是16?那麼0不應該工作? – Aquillo

+0

@PeterLawrey,怎麼回事?不是2? –

+0

+1對不起,對於此構造函數,最小值爲1. –

3

If you see docs

有一些線索。

迭代此集合需要的時間與HashSet實例的大小(元素數)加上支持HashMap實例(桶的數量)的「容量」的總和成正比。因此,如果迭代性能很重要,不要將初始容量設置得太高(或者負載因子太低)是非常重要的。

6

HashSet的使用HashMap中存儲數據:

public HashSet(int initialCapacity) { 
map = new HashMap<E,Object>(initialCapacity); 
} 

而參數:initialCapacity = 0,

public HashMap(int initialCapacity, float loadFactor) { 
    .... 
    // Find a power of 2 >= initialCapacity 
    int capacity = 1; 
    while (capacity < initialCapacity) 
     capacity <<= 1; 
} 

HashMap中容量是1

但如果使用默認的構造函數:

public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

HashMap的容量爲16*0.75

那麼,new HashSet<>(0) init時會保存一些memroy。

5

這會將其設置爲最小值。

很可能這是用來關閉代碼分析器,如果您尚未設置集合的初始容量,則代碼分析器可能會投訴。通過將其設置爲0,您可以將其設置爲最小值。

這不是一個很好的優化,因爲只要添加一個條目,負載因子0.7就會使容量2重新創建Map.Entry[]

0

HashMap的初始加載因子爲16.當HashMap包含12個記錄的數據時,它是其初始大小的75%。那麼HashMap會增加它的大小。

所以在這裏我們只是通過在構造函數中傳遞它來將初始容量設置爲0。

相關問題