java - 为什么 HashMap 比 HashSet 快?

标签 java performance hashmap hashset

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

我不太理解以下陈述:

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

  2. HashSet中,成员对象用于计算两个对象可以相同的hashcode值,因此使用equals()方法来检查是否相等。如果它返回 false,则意味着这两个对象是不同的。在HashMap中,哈希码值是使用键对象计算的。

  3. HashMap 哈希码值是使用键对象计算的。这里,成员对象用于计算hashcode,两个对象的hashcode可以相同,所以使用equals()方法来判断是否相等。如果它返回 false,则表示这两个对象不同。

结束我的问题:

  1. 我认为HashMapHashSet 计算hashcode 的方式相同。它们为什么不同?

  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
    

最佳答案

性能:

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

所以,如果你需要一个 Set 实现,你使用 HashSet,如果你需要一个 Map - HashMap。使用 HashMap 而不是 HashSet 的代码将具有与直接使用 HashSet 完全相同的性能。

选择正确的 Collection

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

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

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

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

关于java - 为什么 HashMap 比 HashSet 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16278995/

相关文章:

performance - VBA,文件系统对象,速度/优点/缺点

c++ - tbb::concurrent_hash_map - 如果键输入被其他线程阻塞,如何返回

c++ - 哈希表的复杂度计算错误?

java - 如何按顺序执行javaFX任务、服务

java - 关于自动装箱,Java 中 Map<Integer, Integer> 的有效替代方案?

java - 如何在 Eclipse 的“打开资源”对话框中隐藏 .class 文件?

c++ - 实现哈希表

Java冷却系统

javascript - react 。呈现和更新 1500 个 <li> 元素的简单列表时非常慢。我认为 VirtualDOM 很快

java - 基于正则表达式的替换效率