HashMap和HashSet有什么共同之处?

时间:2013-12-11 13:55:49

标签: java hashmap hashset

到处都可以找到答案的差异:

映射存储键值,它不同步(不是线程安全),允许空值和只有一个空键,更快获得值,因为所有值都有唯一键等。 设置 - 未排序,获取值较慢,仅存储值,不允许重复或空值。

但是什么意思是哈希词(就是他们有相同的东西)。它是关于散列值的东西还是我希望你能清楚回答我的东西。

7 个答案:

答案 0 :(得分:2)

两者都使用Object的哈希值来存储哪些内部使用Object类的hashCode();方法。

因此,如果要存储自定义类的实例,则需要覆盖hashCode();方法。

答案 1 :(得分:1)

HashSet就像一个HashMap,你不关心值,而只关心键。 因此,只有当给定的密钥K在集合中而不是它所映射的值V时才关心(您可以将其视为V是常量,例如对于HashSet中的所有密钥,V = Boolean.TRUE)。所以HashSet没有值(V set)。这与结构观点完全不同。散列部分意味着当将元素放入结构时,Java首先调用hashCode方法。另请参阅http://en.wikipedia.org/wiki/Open_addressing以了解一般情况下会发生什么
如果两个对象相同,则哈希值用于更快地检查。如果两个对象具有相同的散列,则它们可以相等或不相等(因此它们将与equals方法进行相等性比较)。但如果他们有不同的哈希,他们肯定是不同的,不需要检查平等。这并不意味着如果两个对象具有相同的哈希值,则当它们存储在HashSet或HashMap中时,它们会相互覆盖。

答案 2 :(得分:1)

HashSetHashMap有许多共同点:

  1. 他们名字的开头 - 这是真实相似性的线索。
  2. 他们使用哈希码(来自所有Java对象中内置的hashCode方法)来快速处理和组织对象。
  3. 它们都是无序集合 - 但都提供有序变量(LinkedHashX以按添加顺序存储对象)
  4. 还有TreeSet / TreeMap来对集合中存在的所有对象进行排序并对其进行排序。 TreeSet与TreeMap的比较将发现与HashSet和HashMap之间的差异和相似之处非常相似。
  5. 它们也受到哈希算法的优势和局限性的影响。

    1. 哈希仅在对象具有良好行为的哈希函数时才有效。
    2. 如果equalshashCode没有遵循正确的合同,则哈希完全中断。
    3. 集合中的地图和对象中的关键对象应该是不可变的(或者至少它们的hashCodeequals返回值永远不会改变),否则行为将变为未定义。
    4. 如果您查看Map API,您还可以看到许多其他有趣的连接 - 例如keySetentrySet都返回Set这一事实。

      所有Java集合都不是线程安全的。其他包中的一些较旧的类是,但他们大多数已经退休。有关线程安全性,请查看concurrent包以获取非线程安全性查看collections包。

答案 3 :(得分:1)

只需查看HashSet source code,您就会看到它使用HashMap。因此它们具有与null安全性,同步等相同的属性:

public class HashSet<E>

...

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

...

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

...

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

...

}

答案 4 :(得分:0)

两者都不是Thread安全的,并使用hashCode()存储值。这是常见的事实。另一个是Java集合框架的成员。但这两者之间存在很多差异。

答案 5 :(得分:0)

Hash认为用于将密钥转换为索引的技术。回到数据结构类中,我们习惯学习如何构造哈希表,为此,您需要获取作为值插入的字符串,并将它们转换为数字,以索引内部使用的数组作为存储数据结构。

一个也被讨论过的问题是找到一个最小切割时会产生的散列函数,这样我们就不会有两个不同的对象,不同的键共享相同的位置。

因此,哈希是关于如何处理密钥的存储方式。如果我们考虑它一段时间,没有(真正的)方法用字符串索引内存,只有数字,所以有一个2d结构就像一个由字符串索引的表(或你想要的对象) )您需要为该字符串生成一个数字(或哈希),并将该值存储在此索引的数组中。但是,如果您需要密钥“name”,则需要使用不同的数组,在同一索引中存储密钥“name”。

干杯

答案 6 :(得分:0)

“HASH”这个词很常见,因为它们都使用散列机制。 HashSet实际上是使用HashMap实现的,在Set的每个条目上使用虚拟对象实例。因此每个条目的浪费为4个字节。