2013-04-23 67 views
4

当使用HashMap时,对于元素检索来说,速度对象类型有多重要?假设我使用循环来遍历大型散列映射的可能键。什么是我可以使用的最有效的密钥类型?哈希映射中最有效的键对象类型?

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

+1

我不认为在HashMap中的速度类型的关键问题。大小不重要对象类型。 – 2013-04-23 06:30:47

+0

真的吗?当你考虑它时,它似乎很重要。必须进行一些比较,检查哈希映射中是否存在请求的密钥。它可能寻找内存位置,还是以不同的方式工作?现在我很想知道。虽然,我确实相信你XD的解释会很棒。 – 2013-04-23 06:33:51

回答

3

散列图会问你一个hashCode()关键。如果生成散列码所用的时间不合理,那么这些对象的插入和检索时间就会很长。以java.net.URL为例。这是哈希码方法执行DNS查找。这样的对象不会构成哈希映射的好钥匙。

因为没有最好的钥匙,所以没有普遍的答案,哪个是最好的钥匙。在散列图中使用的最佳密钥是您需要检索的密钥。只要确保密钥的hashCode()是快速的,并适当地使用int的空间。

+1

我讨厌听起来像一个四岁,但为什么是没有最好的钥匙?在对象类型无关紧要的较低级别中发生了什么? – 2013-04-23 06:38:29

+0

效率受hashCode和equals影响,正如这里的一些答案所示。但是没有最好的关键是你可能有使用哈希数据结构的理由。如果您已经有了一种您需要用来快速访问数据的现有类型,那么您将使用这种类型的密钥:-) – Kirby 2013-04-23 06:40:56

+0

对象类型与它的'hashCode()'无关紧要。哈希映射采用hashCode并将哈希函数应用于它。散列函数将hashCode从“int”空间减少到0 - > N之间的索引,其中N是用于存储对象的数组的大小。最重要的是'hashCode' impl。 @Kirby已经解释了我正在努力的一点。 – 2013-04-23 06:42:39

1

重要的是执行等于hashCode方法。参见以下内容:What issues should be considered when overriding equals and hashCode in Java?

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

一点题外话,牢记参考链接提出的观点:

请确保你投入 集合的关键对象的hashCode()方法永远不会改变,而对象是在集合。防弹的方式来保证这是让你的钥匙不可改变的,其中 也有其他好处。

1

重要的是你的情况下hashCode方法的元素和equals方法的速度。使用Integer很好,因为它们不需要对散列值进行任何特殊计算。字符串也是可以的,因为散列值被内部缓存,虽然它们的执行速度比较慢,equals

3
  1. 主要hashCode()equals()要快

  2. hashCode()应该是均匀分布,以尽量减少散列冲突

+1

2:请注意,java.util.HashMap的实现使用一些位混洗来确保密钥均匀分布,即使您的哈希码不是那么好。你仍然必须确定他们是不同的,虽然..也看到这个职位:http://stackoverflow.com/questions/2414117/explanation-of-hashmaphashint-method – rethab 2013-04-23 06:48:13

0

您是否试图通过获取方法或通过迭代方法从HashMap中检索值?至于得到方法,上面的所有人都回答了这个问题。

如果您通过entrySet方法遍历HashMap,则HashMap中的键类型无关紧要。此外,在每次迭代中手头输入entrySet,查找值变得毫无用处。还要注意,entrySet通常优于方法和keySet方法,因为它们都在内部使用entrySet迭代器并返回条目的键或值。