.NET HashTable.Insert
的实现在实际插入操作之前有以下行:
int emptySlotNumber = -1; // We use the empty slot number to cache the first empty slot.
// We chose to reuse slots create by remove that have the
// collision bit set over using up new slots.
前进到执行实际插入的do-while
循环,我们有两个条件来检查这种潜在的重用可能性;它们都检查存储桶是否曾经包含一个条目但现在是否可用,并且在检查是否设置了冲突位(第一个if
)或不是(第二个if
)方面有所不同:
这是第一个if
:
if (emptySlotNumber == -1 && (buckets[bucketNumber].key == buckets) &&
(buckets[bucketNumber].hash_coll < 0))
和第二个(请忽略检查预先||
运算符,这与我的问题无关):
if ((buckets[bucketNumber].key == null) || // please ignore this line
(buckets[bucketNumber].key == buckets &&
((buckets[bucketNumber].hash_coll & unchecked(0x80000000))==0)))
值得一提的是,如果存储桶设置了冲突位,则HashTable.Remove
会初始化hash_coll
字段并引用buckets
:
// Clear hash_coll field, then key, then value
buckets[bn].hash_coll &= unchecked((int)0x80000000);
if (buckets[bn].hash_coll != 0) {
buckets[bn].key = buckets;
}
else {
buckets[bn].key = null;
}
buckets[bn].val = null;
我的问题是:此实施如何有助于使用HashTable
的效果?我要感谢一个例子,说明如果HashTable的存储桶实现没有 可能会发生什么(希望这是正确的语法时态) < / sub> buckets[bn].key = buckets
的值(但只有&#39; noraml&#39;值或null
如果删除)。