为什么HashMap比HashSet快?

2022-09-02 12:07:37

我一直在阅读/研究为什么比.HashMapHashSet

我不太理解以下说法:

  1. HashMap比因为值与唯一键相关联而快。HashSet

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

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

总结一下我的问题:

  1. 我以同样的方式思考和计算哈希码。为什么它们不同?HashMapHashSet

  2. 您能提供一个具体的例子来说明如何以不同的方式计算哈希码吗?HashSetHashMap

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

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

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

答案 1

性能:

如果你看一下HashSet的源代码(至少是JDK 6,7和8),它在内部使用HashMap,所以它基本上完全符合你对示例代码所做的。

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

选择合适的产品系列

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

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

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

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


答案 2

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


推荐