當一個散列表被初始化時,內存是如何分配的?當我們向它添加新成員時,散列表使用的內存如何被擴展?是否曾經發生過一個哈希表不能在固定大小後存儲對象?如何爲Hashtable分配內存?
回答
您可以使用.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
是做什麼的。
Hashtable管理它的大小 - 所以你不會遇到一種情況,除非你的內存不足(或者如果你試圖插入一個重複的鍵,當然),否則你不能插入一個對象。
按照docs:
當實際負荷因子達到 指定的加載因子,水桶的 自動增加 到最小的質數比兩倍的當前數量 數字越大水桶的 。
看到Merlyn的迴應,我真的應該收回我的'無限哈希表'的評論 - 但是,如果你發現自己處於一個將20億個對象放置到哈希表中的情況,那麼你肯定需要更好的存儲方法! – 2010-09-14 06:22:16
+1。鏈接到相關文檔也很有幫助:) – 2010-09-14 06:23:09
- 1. 如何爲ASP.NET網站分配內存?
- 2. 如何爲字符串分配內存?
- 3. NSMutableData如何分配內存?
- 4. javascript如何分配內存?
- 5. 如何爲int a [10] [10]分配內存分配器
- 6. dynamiclly爲類分配內存
- 7. 爲NSString分配內存?
- 8. 爲struct「error」分配內存
- 9. 分配內存爲載體
- 10. 內存分配行爲8
- 11. 爲結構分配內存
- 12. 爲數組分配內存
- 13. Hashtable使用多少內存?
- 14. 免費Hashtable的內存
- 15. 內存分配
- 16. 內存分配
- 17. 內存分配
- 18. 內存分配
- 19. 內存分配
- 20. 內存分配
- 21. 內存分配
- 22. 分配內存
- 23. 內存分配
- 24. 內存分配
- 25. 內存分配
- 26. 內存分配
- 27. 內存分配
- 28. 如何分配內存以及如何釋放內存?
- 29. 如何將分配的內存分解爲多個區域並分配進程?
- 30. CF內存分配例如
嗨,你能解釋一下在初始化時如何分配內存嗎? – TAdhav 2010-09-14 06:22:22
@Tanuja:另外請注意,在.NET中還有其他字典類,我們特別談論'System.Collections.Hashtable',它可能不是您的最佳實施方案:) – 2010-09-14 06:28:45
.Net Reflector擁有許多答案生活中的問題。不幸的是,自從最近一次更新以來,地雷一直被破壞...... :) – 2010-09-14 06:36:45