除了HashSet
不允许重复值的事实之外,HashMap
和之间有什么区别HashSet
?
我的意思是实施明智?这有点含糊,因为它们都使用哈希表存储值。
除了HashSet
不允许重复值的事实之外,HashMap
和之间有什么区别HashSet
?
我的意思是实施明智?这有点含糊,因为它们都使用哈希表存储值。
Answers:
它们是完全不同的构造。A HashMap
是的实现Map
。一个地图键映射到值。密钥查找使用散列进行。
另一方面, HashSet
是的实现Set
。一组被设计成一组的数学模型相匹配。一个HashSet
不使用HashMap
支持其实现,正如你指出。但是,它实现了完全不同的接口。
HashSet不同步,这意味着除非显式同步,否则它们不适合线程安全操作。
add contains next notes
HashSet O(1) O(1) O(h/n) h is the table
HashMap不同步,这意味着除非明确同步,否则它们不适合线程安全操作。
get containsKey next Notes
HashMap O(1) O(1) O(h/n) h is the table
请参考本文以找到更多信息。
他们两个名字都以Hash开头真的很可惜。那是他们中最不重要的部分。正如其他人指出的那样,重要的部分在哈希表之后 - 集合和地图。它们分别是Set(无序集合)和Map(具有键访问权限的集合)。它们恰好是用散列实现的-这就是名称的来源-但其本质隐藏在名称的该部分之后。
不要被他们的名字弄糊涂了;他们是完全不同的东西。
在Hashset
内部实现HashMap
。如果看到内部实现,则在HashSet中插入的值将作为键存储在HashMap中,并且该值是Object类的Dummy对象。
HashMap与HashSet之间的区别是:
HashMap
包含键值对,每个值都可以通过键访问,因为每次都需要迭代HashSet,因为没有get方法。HashMap
实现Map接口,并允许一个null值作为键,并允许多个null值作为值;而在HashSet
实现Set接口时,仅允许一个null值,并且不允许重复值。作为HashSet在内部实现HashMap)。 HashSet
并且HashMap
在迭代时不保持插入顺序。顾名思义,HashMap 是关联映射(从键到值的映射),HashSet只是Set。
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;
}
其中将Object放入映射中作为键和值的是最终对象PRESENT,该对象是虚拟的。
2) HashMap和HashSet之间的第二个区别是,我们使用add()方法将元素放入Set中,但是我们使用put()方法将键和值插入Java中的HashMap中。
3) HashSet只允许一个空键,但是HashMap可以允许一个空键+多个空值。
这就是Java中HashSet和HashMap之间的区别。总之,HashSet和HashMap是Collection的两种不同类型,一种是Set,另一种是Map。
HashSet在内部使用HashMap来存储其条目。内部HashMap中的每个条目都由单个Object键控,因此所有条目都哈希到同一存储桶中。我不记得内部HashMap用于存储其值的内容了,但是这并不重要,因为该内部容器永远不会包含重复的值。
编辑:要解决马修的评论,他是对的;我倒退了。内部HashMap 用组成Set元素的Object进行键控。HashMap的值是一个仅存储在HashMap存储桶中的对象。
您几乎回答了自己的问题-哈希集不允许重复的值。使用后备哈希表构建哈希集(并且仅检查值是否已存在)将是微不足道的。我猜想各种Java实现要么这样做,要么实现一些自定义代码以更有效地实现它。
java.util.HashSet
表示由java.util.HashMap
。
基本上,在HashMap中,用户必须同时提供键和值,而在HashSet中,您仅提供值,则使用哈希函数从值自动派生键。因此,在拥有键和值之后,HashSet可以在内部存储为HashMap。