HashSet
不允许重复值之外,HashMap
和 HashSet
有什么不同?我是说在实现上有何不同?这有点含糊,因为两者都使用哈希表来存储值。
HashSet
不允许重复值之外,HashMap
和 HashSet
有什么不同?HashSet是一个集合,例如{1,2,3,4,5}
HashMap是一个键 -> 值 (key to value) 映射表,例如{a -> 1, b -> 2, c -> 2, d -> 1}
请注意在上面的HashMap示例中,键不能重复,但值可以重复。
而在HashSet中,元素不得重复。
HashMap
是Map
的实现。Map将键映射到值。键查找使用哈希进行。HashSet
是Set
的实现。Set旨在匹配集合的数学模型。HashSet
确实使用HashMap
来支持其实现,正如您所指出的那样。然而,它实现了完全不同的接口。Collection
时,这个Tutorial是一个很好的起点。如果您真的想知道发生了什么,there's a book for that也可以。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开头。那只是它们中最不重要的部分。重要的部分在Hash之后 - 也就是其他人指出的Set和Map。它们分别是无序集合Set和具有键访问的集合Map。它们恰好是用哈希实现的 - 这就是它们名称的来源 - 但它们的本质隐藏在名称的这一部分之后。
不要被它们的名称所困惑; 它们是非常不同的东西。
Hashset
内部实现了HashMap
。如果您查看实现方式,则HashSet中插入的值被存储为HashMap中的键,而该值是Object类的虚拟对象。
HashMap和HashSet之间的区别如下:
HashMap
包含键值对,每个值都可以通过键访问,而HashSet需要每次迭代,因为没有获取方法。HashMap
实现Map接口,允许一个空值作为键和多个空值作为值,而HashSet
实现Set接口,仅允许一个空值和无重复值。(请记住HashMap键中允许一个空键,因此HashSet中允许一个空值,因为HashSet在内部实现了HashMap)。HashSet
和HashMap
在迭代时不维护插入顺序。HashSet允许我们将对象存储在集合中,而HashMap允许我们根据键和值存储对象。每个对象或存储的对象都将具有键。
如它们的名称所示,HashMap是一个关联的Map(从键到值的映射),HashSet则只是一个Set。
Java中HashSet和HashMap的区别
1) HashMap和HashSet最显著的区别是,HashMap是Map接口的实现,而HashSet是Set接口的实现。这意味着HashMap是基于键值对的数据结构,而HashSet通过不允许重复保证唯一性。实际上,在Java中,HashSet是HashMap的包装器。如果您查看HashSet.java中的add(E e)方法代码,您将看到以下代码:
public boolean add(E e)
{
return map.put(e, PRESENT)==null;
}
它将对象作为键放入映射中,值是一个虚拟的 final 对象 PRESENT。
2) HashMap 和 HashSet 的第二个区别是,在 Java 中我们使用 add() 方法将元素放入 Set 中,但是我们使用 put() 方法将键和值插入到 HashMap 中。
3) HashSet 只允许一个空键,但是 HashMap 可以允许一个空键和多个空值。
这就是 Java 中 HashSet 和 HashMap 之间的区别。总结一下,HashSet 和 HashMap 是两种不同类型的集合,一个是 Set,另一个是 Map。
HashMap
是用于添加、获取、删除等操作的对象,这些对象由任何类型的自定义键索引。HashSet
是用于添加元素、删除元素和通过比较它们的哈希值来检查元素是否存在的集合。equals()
方法。 - user207421HashSet和HashMap在Java中的区别
HashSet内部使用HashMap来存储对象。当调用add(String)方法时,它会调用HashMap的put(key,value)方法,其中key=String对象,value=new Object(Dummy)。因此,它维护了没有重复对象,因为键就是值对象。
在Hashset/HashMap中存储为键的对象应该覆盖hashCode和equals协议。
用于访问/存储HashMap中值对象的键应该声明为final,因为当其被修改时,无法定位值对象并返回null。