【问题标题】:Difference between HashSet and HashMap?HashSet 和 HashMap 的区别?
【发布时间】:2011-02-15 23:01:50
【问题描述】:

除了HashSet不允许重复值之外,HashMapHashSet有什么区别?

我的意思是实施明智?这有点模糊,因为两者都使用 哈希表 来存储值。

【问题讨论】:

标签: java collections hashmap hashset


【解决方案1】:

HashSet 是一个 set,例如{1,2,3,4,5}

HashMap 是一个 key -> value(key to value)映射,例如{a -> 1, b -> 2, c -> 2, d -> 1}

请注意,在上面的示例中,HashMap 中不能有重复的键,但它可能有重复的值。

在HashSet中,不能有重复的元素。

【讨论】:

  • 但是(最有趣的)造成混淆的原因是,即使在 HashSet 中,您也需要一个“键”来访问元素。即,即使在数学中,对象也有名称(或地址),如果它们要被访问或引用的话。所以从这个意义上说,HashSet 是一个特别简单的 HashMap,以元素的名称(或地址)为键。
【解决方案2】:

它们是完全不同的结构。 HashMapMap 的实现。 Map 将键映射到值。使用散列进行键查找。

另一方面,HashSetSet 的实现。 Set 旨在匹配集合的数学模型。正如您所指出的,HashSet 确实使用HashMap 来支持其实现。但是,它实现了一个完全不同的接口。

当您正在寻找最适合您的目标的Collection 时,这个Tutorial 是一个很好的起点。如果你真的想知道发生了什么,there's a book for that 也是。

【讨论】:

  • 这个说法有点简单。幕后还有更多内容,“”返回指定对象的哈希值。除了对象自己的 hashCode 之外,此方法还应用了“补充散列函数”,它可以防止 质量散列函数。这很关键,因为 HashMap 使用两个长度哈希表的幂。”weblogs.java.net/blog/2005/06/18/hashmap-implementation - 但是,如果您查看文档,您会发现此哈希将内容分布在“桶”上,所以最后我相信有两件事可以映射到同一个桶。
  • 回答你的第二个问题 - 不。如果您想要 @Bruno Rothgiesser 的出色答案所定义的 (key -> value),则可以使用地图。集合用于非重复元素。如果您想要重复而不是键-> 值,我会检查 java.util.List 实现。查看 Collection 教程以获得权威指南:java.sun.com/docs/books/tutorial/collections/index.html
  • @justk:是的,你可以在一个bucket中获取两个key,然后用equals()来区分它们。这就是为什么 hashCode() 和 equals() 必须兼容的原因。
  • @SpikETidE:HashMap 和 HashSet 都不允许重复。这就是重点。
  • @SpikETidE:集合没有键/值对,只有元素。 HashSet 是通过一个 HashMap 来实现的,其中集合元素作为键,值被忽略。
【解决方案3】:

哈希集

  1. HashSet 类实现 Set 接口
  2. 在 HashSet 中,我们存储对象(元素或值) 例如如果我们有一个字符串元素的 HashSet,那么它可以描述一个 HashSet 元素集:{“Hello”、“Hi”、“Bye”、“Run”}
  3. HashSet 不允许重复元素,这意味着您 不能在 HashSet 中存储重复值。
  4. HashSet 允许有一个空值。
  5. HashSet 不同步,这意味着除非明确同步,否则它们不适合线程安全操作。[相似性]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 
    

哈希映射

  1. HashMap 类实现 Map 接口
  2. HashMap 是 用于存储键值对。简而言之,它保持 key & value 的映射(HashMap 类大致等价于 Hashtable,除了它是不同步的并且允许空值。)这个 是如何表示 HashMap 元素,如果它有整数键 和字符串类型的值:例如{1->“你好”、2->“嗨”、3->“再见”、 4->“运行”}
  3. HashMap 不允许重复键,但它允许重复值。
  4. HashMap 允许单个空键和任意数量的空值。
  5. HashMap 不同步,这意味着它们不适合线程安全操作,除非显式同步。[相似性]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 
    

请参考this article了解更多信息。

【讨论】:

    【解决方案4】:

    真可惜他们的名字都以Hash开头。这是其中最不重要的部分。正如其他人所指出的,重要的部分在 Hash 之后 - SetMap。它们分别是一个 Set - 一个无序的集合 - 和一个 Map - 一个有键访问的集合。它们碰巧是用哈希实现的——这就是名称的来源——但它们的本质隐藏在它们名称的那部分后面。

    不要被他们的名字所迷惑;它们是完全不同的东西。

    【讨论】:

    • @HiteshSahu 它们都使用哈希表 (en.wikipedia.org/wiki/Hash_table) 实现。这是一个很好的表示集合的数据结构,以正确的方式高效,并且本质上,HashMap 的键被实现为 HashSet。因此,无论谁为它们命名都遇到了一些麻烦来实现它们,并且专注于实现而不是它们的目的(猜测)。
    【解决方案5】:

    Hashset 在内部实现HashMap。如果您看到内部implementation,则插入 HashSet 中的值作为键存储在 HashMap 中,并且该值是 Object 类的 Dummy 对象。
    HashMap 与 HashSet 的区别在于:-

    1. HashMap 包含键值对,每个值都可以通过键访问,因为没有 get 方法,每次都需要迭代 HashSet。
    2. HashMap 实现了 Map 接口,允许一个空值作为键,多个空值作为值,而HashSet 实现了 Set 接口,只允许一个空值,不允许重复值。(请记住,HashMap 键中允许一个空键,因此HashSet 中的一个空值作为 HashSet 在内部实现 HashMap)。
    3. HashSetHashMap 在迭代时不保持插入顺序。

    【讨论】:

      【解决方案6】:

      HashSet 允许我们将对象存储在集合中,而 HashMap 允许我们根据键和值来存储对象。每个对象或存储的对象都有键。

      【讨论】:

        【解决方案7】:

        顾名思义,HashMap 是一个关联 Map(从键映射到值),HashSet 只是一个设置

        【讨论】:

        • @SpikETidE 上面说的是唯一性如何实现的细节,但是HashSet的意思是实现一个集合。
        • so.. 这一切都归结为“如果你不想重复使用 hashSet...如果你不关心重复使用 HashMap”......?
        • Java 没有为“具有潜在重复元素的集合”(“包”)实现特定的类,您可以为此使用 List(尽管 List 为包添加了一些语义:order ; 但你可以忽略它)。
        【解决方案8】:

        Java中HashSet和HashMap的区别

        1) HashMap 和 HashSet 的第一个也是最显着的区别是 HashMap 是 Map 接口的实现,而 HashSet 是 Set 接口的实现,这意味着 HashMap 是基于键值的数据结构并且 HashSet 通过不允许重复来保证唯一性。实际上 HashSet 是 Java 中 HashMap 的包装器,如果您查看 HashSet.java 的 add(E e) 方法的代码,您将看到以下代码:

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

        其中将对象作为键和值放入映射中的最终对象是 PRESENT,它是虚拟的。

        2) HashMap 和 HashSet 的第二个区别是,我们使用 add() 方法将元素放入 Set,但我们使用 put() 方法将键和值插入 Java 中的 HashMap。

        3) HashSet只允许一个空键,而HashMap可以允许一个空键+多个空值。

        这就是 Java 中 HashSet 和 HashMap 之间的区别。总之,HashSet 和 HashMap 是两种不同类型的 Collection,一种是 Set,另一种是 Map。

        【讨论】:

          【解决方案9】:

          Java中HashSet和HashMap的区别

          HashSet 内部使用 HashMap 来存储对象。当调用 add(String) 方法时,它会调用 HahsMap put(key,value) 方法,其中 key=String object & value=new Object(Dummy)。因此它不会保持重复,因为键是只有值对象。

          作为键存储在 Hashset/HashMap 中的对象应覆盖哈希码和等于合约。

          用于在 HashMap 中访问/存储值对象的键应声明为 Final,因为当它被修改时,值对象无法定位并返回 null。

          【讨论】:

            【解决方案10】:

            HashMap 用于添加、获取、删除……由任何类型的自定义键索引的对象。
            HashSet 是添加元素、删除元素并通过比较它们的哈希值来检查元素是否存在。

            所以 HashMap 包含元素,而 HashSet 记住它们的哈希值。

            【讨论】:

            • 通过比较他们的哈希值并调用他们的equals()方法。
            【解决方案11】:

            HashSet 在内部使用 HashMap 来存储其条目。内部 HashMap 中的每个条目都由单个 Object 键入,因此所有条目都散列到同一个存储桶中。我不记得内部 HashMap 使用什么来存储其值,但这并不重要,因为该内部容器永远不会包含重复值。

            编辑:为了解决马修的评论,他是对的;我倒过来了。内部 HashMap 以组成 Set 元素的对象为键。 HashMap 的值是一个简单地存储在 HashMap 存储桶中的对象。

            【讨论】:

            • 这不对。 set 元素直接用作 HashMap 键。
            【解决方案12】:

            区别: 关于层次结构: HashSet 实现了 Set。 HashMap 实现 Map 并存储键和值的映射。

            在数据库中使用 HashSet 和 HashMap 可以帮助您理解它们的重要性。
            HashSet: 一般用于存储唯一的集合对象。 例如:它可以用作实现类,用于存储
            class Item 和 Class Bid where (Item has many Bids) 之间的多对一关系 HashMap: 用于将键映射到值。值可以为 null 或任何对象/对象列表(本身就是对象)。

            【讨论】:

              【解决方案13】:

              HashSetHashMap 的形式实现。它是键和 PRESENT 对象之间的映射。

              【讨论】:

              • 什么是“PRESENT 对象”?
              【解决方案14】:

              HashMap 是一个Map 实现,允许重复值,但不允许重复键。。要添加对象,需要键/值对。允许使用 Null 键和 Null 值。例如:

              {The->3,world->5,is->2,nice->4}

              HashSet 是一个Set 实现,它不允许重复。如果您尝试添加重复对象,调用public boolean add(Object o) 方法,则集合保持不变并返回false。例如:

              [世界,美好,美好]

              【讨论】:

                【解决方案15】:

                您几乎回答了您自己的问题 - 哈希集不允许重复值。使用支持哈希图构建哈希集将是微不足道的(并且只需检查该值是否已经存在)。我猜各种 java 实现要么做到这一点,要么实现一些自定义代码来更有效地做到这一点。

                【讨论】:

                • @oedo - java.util.HashSet 说这是由 java.util.HashMap 支持的。
                • 不允许重复不是它们之间的区别。
                【解决方案16】:

                基本上在HashMap中,用户必须同时提供Key和Value,而在HashSet中你只提供Value,Key是通过使用哈希函数从Value自动派生的。所以有了 Key 和 Value 之后,HashSet 就可以在内部存储为 HashMap 了。

                【讨论】:

                • HashSet中的值。
                【解决方案17】:

                HashSet 和 HashMap 都是存储对,区别在于 HashMap 中可以指定一个键,而 HashSet 中键来自对象的哈希码

                【讨论】:

                • 如果是这样,HashSet 就无法存储多个具有相同 hashCode 的对象,而且确实如此。
                【解决方案18】:

                HashMaps 允许一个空键和空值。它们不同步,从而提高了效率。如果需要,您可以使用Collections.SynchronizedMap() 使它们同步

                Hashtables 不允许空键并且是同步的。

                【讨论】:

                • 他没有问哈希表。不回答问题。
                【解决方案19】:

                您可以发现它们之间的主要区别如下:

                哈希集

                • 它不允许重复键。
                • 即使不同步,也会有更好的性能。
                • 它允许一个空键。
                • 当你想维护一个唯一的列表时可以使用HashSet。
                • HashSet 实现了 Set 接口,它是由哈希表(实际上是 HashMap 实例)支持的。
                • HashSet 存储对象。
                • HashSet 不允许重复元素,但允许空值。
                • 此界面不保证顺序会随着时间的推移保持不变。

                HashMap

                • 它允许重复键。 它不是同步的,因此性能会更好。
                • HashMap 不维护插入顺序。
                • 顺序由哈希函数定义。
                • 它不是线程安全的
                • 它允许键和值都为 null。
                • 它允许一个空键和任意多个空值。
                • HashMap 是 Map 接口的基于哈希表的实现。
                • HashMap 将对象存储为键值对。
                • HashMap 不允许重复键,但允许空键和空值。
                • 元素的排序不能保证超时。

                【讨论】:

                  【解决方案20】:

                  HashMap 是 Map 接口的一个实现 HashSet 是 Set 接口的一个实现

                  HashMap 以键值对的形式存储数据 HashSet 只存储对象

                  put方法用于在map中添加元素 add方法用于添加元素是Set

                  在 hash map 中 hashcode 值是使用 key 对象计算的 这里成员对象用于计算两个对象可以相同的hashcode值,因此equal()方法用于检查是否相等,如果返回false则表示两个对象不同。

                  HashMap 比 hashset 快,因为使用唯一键访问对象 HashSet 比 Hashmap 慢

                  【讨论】:

                  • 它们具有基本相同的性能,并且'因为使用了唯一密钥'是不正确的。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-06-05
                  • 2020-10-11
                  • 1970-01-01
                  • 2011-07-05
                  • 1970-01-01
                  • 2012-02-11
                  • 2021-09-22
                  相关资源
                  最近更新 更多