HashSet 和 HashMap 的区别?
Posted
技术标签:
【中文标题】HashSet 和 HashMap 的区别?【英文标题】:Difference between HashSet and HashMap? 【发布时间】:2011-02-15 23:01:50 【问题描述】:除了HashSet
不允许重复值之外,HashMap
和HashSet
有什么区别?
我的意思是实施明智?这有点模糊,因为两者都使用 哈希表 来存储值。
【问题讨论】:
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】:它们是完全不同的结构。 HashMap
是 Map
的实现。 Map 将键映射到值。使用散列进行键查找。
另一方面,HashSet
是Set
的实现。 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 之后 - Set 和 Map。它们分别是一个 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)。
HashSet
和 HashMap
在迭代时不保持插入顺序。
【讨论】:
【参考方案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 的区别?的主要内容,如果未能解决你的问题,请参考以下文章