2013-08-19 23 views
4

什麼初始容量應該用於HashSet,我知道我將插入1000個整數以防止需要進行任何內部重建?HashSet的初始容量<Integer>

起初我雖然我應該使用1000,但閱讀的構造函數的說明獲取initialCapacity參數它說Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75).

因此,如果我將容量設置爲1000,那麼hashMap將在達到750個元素時調整大小?

另外我假設一些「空間」是需要的有效性的哈希映射,所以解決IC * 0.75 = 1000得到像1334這樣的東西也可能不是最好的解決方案還是它?

UPDATE:
1)據我所知,內部重新大小的含義是不顯著之一,但它還是一個學習和更好地瞭解我使用的環境機會。並且努力應該是最小的。

2)關於選擇數據結構的幾點意見。請在這裏查看我之前的Q:Data structure recommendation,其中提供了有關我的場景的更多確切信息。

+0

你打算插入1000個以上的整數嗎? –

+1

那麼爲什麼你不使用這個構造函數呢? 'HashSet(int initialCapacity,float loadFactor)' –

+0

那些納秒必須對你來說非常重要。 –

回答

2

您需要size/load-factor才能避免調整大小。注意:它始終是HashSet & HashMap的下一個2的冪。

+0

什麼將是二的力量?比例還是大小? (顯然不是負載因素)。我猜你的答案中的HashMap應該是一個HashSet ... – epeleg

+0

@eleleg桶的數量總是2的乘方。這被用來使位掩碼代替尋找右桶的模數散列。 –

2

如果是真的值得擔心這個(我懷疑這是不是 - 調整了一組1000個整數用不了多長時間),然後記住,HashSetHashMap支持和put方法引用this

addEntry(int hash, K key, V value, int bucketIndex) { 

    Entry<K,V> e = table[bucketIndex]; 

    table[bucketIndex] = new Entry<K,V>(hash, key, value, e); 
    if (size++ >= threshold) 
     resize(2 * table.length); 
} 

它總是值得checking out the source cod E對於這樣的質疑,雖然牢記實現可能隨時改變(即使是輕微的JRE釋放)。

最後,對於這種情況,是否設置了適當的?如果你有一個固定大小的整數分配,也許一個簡單的數組(使用基元,從而避免裝箱)會更快/更簡單?

+1

知道減少正確答案的原因總是很有意思的。 Downvoters,花一分鐘來解釋你的理由! – AlexR

+0

是的。我會第二個! –

+0

感謝您對grepCode的參考 - 我不知道它。我也贊同反對票。但是我錯過了你展示這段特定代碼的觀點。至於數據結構的選擇看看我以前的問題:http://stackoverflow.com/questions/18299937/data-structure-recommendation因爲它更好地解釋了完整的場景。 – epeleg

2

對於你的情況,這是合理的初始容量設置到1000和負載因子爲1作爲兩個不同Integer旨意不共享相同的哈希值(其是中的int本身)。

儘管如此,對於一般用途而言,您不應該真正關心加載因子並將其保留原樣,因爲您可能永遠不會注意到自己設置的任何改進。增加負載因子實際上可能會導致性能急劇下降。

+0

如果您必須設置「負載係數」和「初始容量」,我相信這是最好的答案。將容量設置爲您需要的值,並將負載因子設置爲需要全套設置。由於你的設置大小是固定的,它不應該重新加載。 –

+0

整數怎樣才能成爲散列鍵本身?假設他們來自0-999999的範圍?而hashMap只有1000個桶...我在這裏丟失了什麼? – epeleg

0

我認爲,理想的初始容量是將它保持在你想要插入的整數的數量上,並且加載因子保留爲默認值。

go for <#整數> /0.75加載因子。

+0

這是否至少在重建時不能保證100%的確定性? – epeleg