为什么HashMap比HashSet更快?

run*_*ode 14 java performance hashmap hashset

我一直在阅读/研究为什么HashMap比它更快的原因HashSet.

我不太了解以下陈述:

  1. HashMapHashSet因为值与唯一键相关联更快.

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

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

总结我的问题:

  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
    
    Run Code Online (Sandbox Code Playgroud)

den*_*nis 19

性能:

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

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

选择合适的系列

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

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

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

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

  • 丹尼斯说的是什么.此外,您可以使用Collections.newSetFromMap使用集合包装任何Map. (2认同)

Twi*_*ats 9

这些答案都没有真正解释为什么HashMap 比 HashSet 快。他们都必须计算哈希码,但考虑一下 HashMap 键的性质——它通常是一个简单的字符串,甚至是一个数字。计算它的哈希码比整个对象的默认哈希码计算快得多。如果 HashMap 的键与存储在 HashSet 中的对象相同,则性能不会有真正的差异。不同之处在于 HashMap 的键是哪种对象。