为什么HashMap比HashSet更快?

时间:2013-04-29 12:46:32

标签: java performance hashmap hashset

我一直在阅读/研究HashMapHashSet更快的原因。

我不太了解以下陈述:

  1. HashMapHashSet快,因为这些值与唯一键相关联。

  2. HashSet中,成员对象用于计算哈希码值,对于两个对象,哈希码值可以相同,因此equals()方法用于检查是否相等。如果它返回false,则表示两个对象不同。在HashMap中,使用密钥对象计算哈希码值。

  3. 使用密钥对象计算HashMap哈希码值。这里,成员对象用于计算哈希码,对于两个对象可以是相同的,因此equals()方法用于检查相等性。如果它返回false,则表示两个对象不同。

  4. 结束我的问题:

    1. 我认为HashMapHashSet以相同的方式计算哈希码。他们为什么不同?

    2. 您能否提供一个具体示例HashSetHashMap如何以不同方式计算哈希码?

    3. 我知道什么是“关键对象”,但“成员对象”是什么意思?

    4. HashMap可以执行与HashSet相同的操作,并且速度更快。我们为什么需要HashSet?例如:

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

2 个答案:

答案 0 :(得分:19)

<强>性能:

如果你看一下HashSet的源代码(至少是JDK 6,7和8),它会在内部使用HashMap,所以它基本上就像你在使用示例代码一样。

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

选择合适的藏品

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

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

如果您需要收集的唯一内容是检查其中是否存在元素 - 请使用Set。您的代码将更清晰,更易于理解。

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

答案 1 :(得分:2)

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