6

使用 aHashMap时,在速度方面,对象类型对元素检索有多大影响?假设我使用循环遍历大型哈希映射的可能键。我可以使用的最有效的密钥类型是什么?

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

4

5 回答 5

5
  1. 关键hashCode()equals()应该很快

  2. hashCode()应该分布良好以最小化哈希冲突

于 2013-04-23T06:34:05.423 回答
3

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

哪个是最好的钥匙没有统一的答案,因为没有最好的钥匙。用于哈希映射的最佳键是检索所需的键。只要确保钥匙的hashCode()速度很快并int适当地使用空间。

于 2013-04-23T06:34:22.200 回答
1

重要的是equalshashCode方法的实现。请参阅以下内容:在 Java 中覆盖 equals 和 hashCode 时应考虑哪些问题?

由于这些函数用于散列操作,因此当您对集合进行操作时,它们的效率就会发挥作用。

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

确保您放入集合中的关键对象的 hashCode() 在对象位于集合中时不会更改。确保这一点的防弹方法是使您的密钥不可变,这还有其他好处。

于 2013-04-23T06:33:11.223 回答
1

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

于 2013-04-23T06:33:36.617 回答
0

您是尝试通过get方法还是通过迭代从 HashMap 中检索值?至于get方法,上面的人都回答过了。

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

于 2013-04-23T06:55:37.877 回答