HashSet 和 HashMap 的区别?

Posted

技术标签:

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

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

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

【问题讨论】:

HashSet是使用HashMap实现的 我认为知道为什么 HashSet 与 ArrayList 不同将帮助您理解上述问题的答案:***.com/questions/18706870/… 【参考方案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】:

哈希集

    HashSet 类实现 Set 接口 在 HashSet 中,我们存储对象(元素或值) 例如如果我们有一个字符串元素的 HashSet,那么它可以描述一个 HashSet 元素集:“Hello”、“Hi”、“Bye”、“Run” HashSet 不允许重复元素,这意味着您 不能在 HashSet 中存储重复值。 HashSet 允许有一个空值。

    HashSet 不同步,这意味着除非明确同步,否则它们不适合线程安全操作。[相似性]

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

哈希映射

    HashMap 类实现 Map 接口 HashMap 是 用于存储键值对。简而言之,它保持 key & value 的映射(HashMap 类大致等价于 Hashtable,除了它是不同步的并且允许空值。)这个 是如何表示 HashMap 元素,如果它有整数键 和字符串类型的值:例如1->“你好”、2->“嗨”、3->“再见”、 4->“运行” HashMap 不允许重复键,但它允许重复值。 HashMap 允许单个空键和任意数量的空值。

    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 的区别在于:-

    HashMap 包含键值对,每个值都可以通过键访问,因为没有 get 方法,每次都需要迭代 HashSet。 HashMap 实现了 Map 接口,允许一个空值作为键,多个空值作为值,而HashSet 实现了 Set 接口,只允许一个空值,不允许重复值。(请记住,HashMap 键中允许一个空键,因此HashSet 中的一个空值作为 HashSet 在内部实现 HashMap)。 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】:

HashSet 以HashMap 的形式实现。它是键和 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 慢

【讨论】:

它们具有基本相同的性能,并且'因为使用了唯一密钥'是不正确的。

以上是关于HashSet 和 HashMap 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

HashSet和HashMap的区别

HashSet 和 HashMap 的区别?

java中HashMap详解

HashMap和HashSet的区别

java面试之Hashmap

java---Hashset与Hashmap的区别