2010-09-14 50 views
2

當一個散列表被初始化時,內存是如何分配的?當我們向它添加新成員時,散列表使用的內存如何被擴展?是否曾經發生過一個哈希表不能在固定大小後存儲對象?如何爲Hashtable分配內存?

回答

3

您可以使用.NET reflector找出。

System.Collections.Hashtable中有一些硬性限制:

double num = ((float) capacity)/this.loadFactor; 
if (num > 2147483647.0) 
{ 
    throw new ArgumentException(Environment.GetResourceString("Arg_HTCapacityOverflow")); 
} 

還銘記保持int.MaxSize能力值(我想容量可能一樣的桶數,根據負載係數)。

如果你打的是大小限制,不過,你可能想尋找到更好的存儲方法比在內存中的哈希表CLR對象...

編輯:

內存爲散列表以這種方式分配:

int num2 = (num > 11.0) ? HashHelpers.GetPrime((int) num) : 11; 
this.buckets = new bucket[num2]; 

[StructLayout(LayoutKind.Sequential)] 
private struct bucket 
{ 
    public object key; 
    public object val; 
    public int hash_coll; 
} 

請參閱Will的回答HashHelpers.GetPrime是做什麼的。

+0

嗨,你能解釋一下在初始化時如何分配內存嗎? – TAdhav 2010-09-14 06:22:22

+0

@Tanuja:另外請注意,在.NET中還有其他字典類,我們特別談論'System.Collections.Hashtable',它可能不是您的最佳實施方案:) – 2010-09-14 06:28:45

+0

.Net Reflector擁有許多答案生活中的問題。不幸的是,自從最近一次更新以來,地雷一直被破壞...... :) – 2010-09-14 06:36:45

2

Hashtable管理它的大小 - 所以你不會遇到一種情況,除非你的內存不足(或者如果你試圖插入一個重複的鍵,當然),否則你不能插入一個對象。

按照docs

當實際負荷因子達到 指定的加載因子,水桶的 自動增加 到最小的質數比兩倍的當前數量 數字越大水桶的 。

+0

看到Merlyn的迴應,我真的應該收回我的'無限哈希表'的評論 - 但是,如果你發現自己處於一個將20億個對象放置到哈希表中的情況,那麼你肯定需要更好的存儲方法! – 2010-09-14 06:22:16

+0

+1。鏈接到相關文檔也很有幫助:) – 2010-09-14 06:23:09