如果一个Hashtable最初的大小为8,并且我们达到了负载因子,并且它的尺寸增加了一倍。如何得到仍然能够检索原始值...所以说我们有一个散列函数键(8)转换为12345作为我们修改了8的散列值,我们得到索引7 ...现在当散列表大小增长到16 ...对于关键(8)我们得到12345 ..如果我们将它改为16,我们将得到不同的答案!那么我该如何检索原始密钥(8)get(key)在哈希表的大小已经增长之后如何工作!
3
A
回答
4
这不是Java特定的 - 当散列表增长时(在我所知的大多数实现中),它必须重新评估所有哈希对象的关键字,并将它们放入新的正确存储桶中,水桶现在可用。
这也是为什么调整散列表的大小通常被认为是“昂贵的”操作(与其他许多操作相比) - 因为它必须访问其中的所有存储项。
3
用于查找值的哈希值来自密钥对象本身,而不是容器。
这就是为什么在Map中用作键的对象必须是不可变的。如果hashCode()
发生变化,您将无法再次找到您的密钥或值。
1
这是所有的实施依赖,但必要时会发生rehash。
1
看一下方法中的HashMap类的来源,该方法由resize()
方法调用。
/**
* Transfers all entries from current table to newTable.
*/
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
此哈希表的实现,你可以按照准确每个条目是如何存储新(两倍大)存储阵列英寸新阵列的容量用于确定每个项目将被存储在哪个插槽中。按键的哈希码不会改变(它其实即使不重新计算,而是从每个Entry
对象,它被保存在名为hash
公共领域检索),什么样的变化是indexFor()
调用的结果:
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
它采用散列码和新存储阵列的长度并返回新数组中的索引。
因此,客户对get()
的新呼叫将通过同一个indexFor()
呼叫,这也将使用新存储阵列的长度,并且一切都会好的。
相关问题
- 1. 形式的哈希表 - 在Java中的<key,哈希表>
- 2. 哈希表如何在WCF中工作?
- 3. 哈希表大小设置
- 4. 如何制作灵活大小的哈希表
- 5. 哈希表的get()操作不工作按照文件
- 6. 哈希表大小取决于密钥的长度?
- 7. 如何计算SHA-256哈希大小
- 8. 的NodeJS v0.10.x(FreeBSD的) “X509_STORE_add_cert:证书已经在哈希表”
- 9. 哈希映射中的哈希部分如何工作?
- 10. Perl哈希阵列大小
- 11. 哈希字符串大小
- 12. 如何实现动态大小的哈希表?
- 13. 如何创建不区分大小写的Glib哈希表?
- 14. 如何在powershell中的哈希表中添加哈希表?
- 15. 查找哈希表(的containsKey)不工作
- 16. 使用Django的密码哈斯已经哈希密码
- 17. “动态盐”哈希如何工作?
- 18. wordpress密码哈希如何工作?
- 19. 一致哈希如何工作?
- 20. 时间戳哈希如何工作?
- 21. Xamarin升级APK文件包含x86_64并且它的大小已经增长
- 22. 如何计算两个哈希之间的增量?
- 23. 如何在Python中生成混合大小写的哈希?
- 24. 动态哈希表中的立即与增量复制调整大小
- 25. jQuery的现在哈希工作在URL
- 26. C#Excel Interop:如何“获取”已经在工作表中的表?
- 27. 什么是MongoDB哈希的大小?
- 28. sha1哈希不工作? C#
- 29. Android哈希不工作
- 30. 如何在哈希中存储哈希哈希?
在他的例子中,散列值没有改变。提问者想知道当Hashtable增长时如何找到相同的哈希值,因此其模数可能会改变,这意味着在同一个桶中不可能找到相同的值。尽管如此,键的优点是不可改变的。我从来没有想过我是否可以在散列表/散列表中丢失我的键值对。 – 2011-06-03 13:17:57