初始化哈希表时,如何为其分配内存?当我们向其添加新成员时,哈希表使用的内存如何扩展?是否曾经发生哈希表无法在固定大小后存储对象?
答案 0 :(得分: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
所做的回答。
答案 1 :(得分:2)
Hashtable管理它的大小 - 所以你不会遇到无法插入对象的情况,除非你的内存不足(或者当你试图插入重复的键时)。< / p>
根据docs:
当实际负载系数达到时 指定的载荷因子,数量 桶自动增加 到最小的素数 大于当前数字的两倍 水桶。