为什么HashMap比HashSet更快?

22
我一直在阅读和研究为什么 HashMap 比 HashSet 更快,但我不太理解以下几个陈述:
1. HashMap 比 HashSet 更快,因为值与唯一键相关联。 2. 在 HashSet 中,成员对象用于计算哈希码值,可能相同,因此使用 equals() 方法检查相等性。如果返回 false,则表示两个对象不同。在 HashMap 中,哈希码值使用键对象计算。 3. HashMap 的哈希码值是使用键对象计算的。在这里,成员对象用于计算哈希码,可能对于两个对象相同,因此使用 equals() 方法来检查相等性。如果返回 false,则表示两个对象不同。
总之我的问题是:
  1. I thought HashMap and HashSet calculate the hashcode in the same way. Why are they different?

  2. Can you provide a concrete example how HashSet and HashMap calculating the hashcode differently?

  3. I know what a "key object" is, but what does it mean by "member object"?

  4. HashMap can do the same things as HashSet, and faster. Why do we need HashSet? Example:

    HashMap <Object1, Boolean>= new HashMap<Object1, boolean>();
    map.put("obj1",true);  => exist
    map.get("obj1");  =>if null = not exist, else exist
    

Hashset是基于HashMap构建的。Set用于保证唯一性,它不是一个键值对集合。 - Amit Deshpande
是的,我知道它们实现了不同的接口。但有些人说hashset在后端使用了hashmap。如果这是真的,为什么hashset会比hashmap慢呢? - runcode
3
如果你不相信的话,可以自己尝试一下......我正在使用哈希集进行在线判断,但是时间超限了。但是我改用哈希映射后就顺利通过了。 - runcode
1
你能用已经测试过的代码样本、时间等来支持你的主张吗? - denis
@MartinAndersson 同意。我甚至都不记得我写过那个... :) - Magnilex
显示剩余2条评论
2个回答

25

性能:

如果您查看HashSet的源代码(至少是JDK 6、7和8),它在内部使用HashMap,所以它基本上与您使用的示例代码完全相同。

因此,如果您需要Set实现,则使用HashSet;如果您需要Map,则使用HashMap。使用HashMap而不是直接使用HashSet的代码将具有完全相同的性能。

选择正确的集合

Map - 将键映射到值(关联数组)- http://en.wikipedia.org/wiki/Associative_array

Set - 不包含重复元素的集合 - http://en.wikipedia.org/wiki/Set_(computer_science)

如果您的集合仅用于检查其中是否存在元素,则使用Set。这样您的代码将更整洁,其他人也更容易理解。

如果您需要为元素存储一些数据,请使用Map。


2
Denis所说的。此外,您可以使用Collections.newSetFromMap将任何Map包装为Set。 - Jilles van Gurp
如果它是一组对象,并且可以通过原始类型进行映射,则最好使用哈希映射而不是哈希集,因为它速度更快,哈希原始键比哈希对象更快。 - Salam El-Banna
HashMap在原始类型上不起作用,即使您使用原始类型,它们也会在转换为对象时进行转换。此外,HashSet只是HashMap的简单包装器,因此HashMap具有与HashSet大致相同的性能。 - denis

18

这些回答都没有真正解释为什么 HashMap 比 HashSet 更快。它们都必须计算哈希码,但考虑一下 HashMap 的键的性质 - 它通常是一个简单的字符串甚至是一个数字。计算其哈希码要比整个对象的默认哈希码计算快得多。如果 HashMap 的键与存储在 HashSet 中的对象相同,性能上就不会有真正的差别。差异在于HashMap的键使用了什么类型的对象。


这应该是最好的答案。 - Mohammed Housseyn Taleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接