我有8000个键/值对。我读到哈希速度为O(1),但是当密钥冲突时,它将变为O(n),其中n是log(项目编号),如果我的概念错误,请纠正我。
然后我想如果我使用多个表,比如说在hashtable1中放置1到3000,在hashtable1中放置3001到6000,那么性能应该有更高的机会2 * O(1)?此外,如何确定表1,2等的最佳尺寸?
另外,我读帖子说如果我不使用多线程来访问hashmap,使用hashmap会更好吗?这是真的吗?
答案 0 :(得分:1)
碰撞的概率仅取决于元素数量与HashTable大小之间的比率。
你可以指定一个初始值,如果你没有,Java会为你处理这个问题。
是的,如果您没有并发访问权限,请使用HashMap,因为您不会有同步数据结构的额外负担。
答案 1 :(得分:0)
你在第一句话中为自己回答了这个问题:我读到哈希速度是O(1),但是在密钥上有冲突。
如果作为键的对象属于您编写的类,那么您可以完全控制hashCode()
的计算方式。使用单个地图并实施hashCode()
,以便极不可能发生冲突。
如果你不控制hashCode()
的操作方式,你仍然可以编写一个包装密钥对象的类并为它们计算自己的哈希代码 - 结果将比使用的东西更容易阅读多个地图。
多地图方法是一种黑客攻击 - 由于哈希冲突导致的性能问题非常罕见 - 在大多数应用程序中,优化I / O和类似的东西比这种微优化更有利。所以通常更好的目标是可读性。