哈希映射中最有效的密钥对象类型?

时间:2013-04-23 06:28:39

标签: java object data-structures hashmap key

使用HashMap时,对于速度而言,对象类型对于元素检索有多重要?假设我使用循环来迭代大型哈希映射的可能键。我可以使用哪种最有效的密钥类型?

截至目前,由于简单起见,我使用String作为键对象类型。在编码时,这个问题突然出现在我的脑海中并激起了我的好奇心。我试图在网上搜索这个问题,但找不到我想要的答案。谢谢!

5 个答案:

答案 0 :(得分:3)

  1. hashCode()equals()应该很快

  2. hashCode()应该分布均匀,以最大限度地减少哈希冲突

答案 1 :(得分:3)

哈希映射会向您的密钥询问hashCode()。如果生成哈希码所花费的时间不合理,则这些对象的插入和检索时间会很长。以java.net.URL为例。它的hashcode方法执行DNS查找。这样的对象不会成为哈希映射的好键。

没有通用的答案,哪个是最好的钥匙,因为没有最好的钥匙。在哈希映射中使用的最佳密钥是检索所需的密钥。只需确保密钥的hashCode()速度很快,并恰当地使用int空格。

答案 2 :(得分:1)

重要的是 equals hashCode 方法的实现。请参阅以下内容:What issues should be considered when overriding equals and hashCode in Java?

由于这些函数在哈希操作中使用,因此当您对集合进行操作时,它们的效率会发挥作用。

作为旁注,请记住参考链接中提出的观点:

  

确保放入的关键对象的hashCode()   当对象在集合中时,集合永远不会更改。该   防弹方式,以确保这是使你的密钥不可变,这   还有其他好处。

答案 3 :(得分:1)

在您的情况下,重要的是元素hashCode方法和equals方法的速度。使用Integer s很好,因为它们不需要对哈希值进行任何特殊计算。字符串也可以,因为哈希值在内部缓存,尽管它们在equals时执行速度较慢。

答案 4 :(得分:0)

您是尝试通过 get 方法从HashMap中检索值还是迭代它?至于 get 方法,以上所有人都回答了这个问题。

如果您通过 entrySet 方法迭代HashMap,则HashMap中键的类型并不重要。此外,在每次迭代中都有一个 entrySet 的条目,查找值变得无用。另请注意,entrySet通常优于 values 方法和 keySet 方法,因为它们在内部使用entrySet迭代器并返回条目的键或值。