有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么HashMap比HashSet快?

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

我不太理解以下陈述:

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

  2. HashSet中,成员对象用于计算两个对象的hashcode值,因此equals()方法用于检查相等性。如果返回false,则表示这两个对象不同。在HashMap中,使用key对象计算hashcode值

  3. 使用key对象计算HashMaphashcode值。这里,member对象用于计算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
    

共 (2) 个答案

  1. # 1 楼答案

    性能:

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

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

    选择正确的收藏

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

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

    如果你只需要检查集合中是否存在元素,那么就使用集合。你的代码会更清晰,让其他人更容易理解

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

  2. # 2 楼答案

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