HashSet和HashMap之间的区别?

时间:2010-05-05 13:56:41

标签: java collections hashmap hashset

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

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

20 个答案:

答案 0 :(得分:285)

HashSet是,例如的 {1,2,3,4,5}

HashMap是键 - >值(键值)映射,例如 {a - > 1,b - > 2,c - > 2,d - > 1}

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

在HashSet中,必须没有重复的元素。

答案 1 :(得分:137)

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

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

如果您正在为自己的目的寻找最佳Collection,那么Tutorial就是一个很好的起点。如果你真的想知道发生了什么,there's a book for that也是如此。

答案 2 :(得分:57)

的HashSet

  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 
    
  6. 的HashMap

    1. HashMap类实现Map接口
    2. HashMap是 用于存储密钥和价值对。简而言之,它维持着 密钥和&的映射value(HashMap类大致相当于 Hashtable,除了它是不同步的并允许空值。)这 如果它具有整数键,你可以如何表示HashMap元素 和String类型的值:例如{1->“Hello”,2->“Hi”,3->“Bye”, 4->”中运行”}
    3. HashMap不允许重复键,但允许重复值。
    4. HashMap允许单个null键和任意数量的空值。
    5. HashMap未同步,这意味着除非明确同步,否则它们不适合线程安全操作。[相似]

                             get      containsKey next     Notes
       HashMap               O(1)     O(1)        O(h/n)   h is the table 
      
    6. 请参阅this article以了解更多信息。

答案 3 :(得分:34)

他们的名字都以哈希开头真是太遗憾了。这是他们中最不重要的部分。其他人指出,重要的部分来自哈希 - 设置地图。它们分别是 Set - 无序集合 - 以及 Map - 具有键控访问权限的集合。它们碰巧是用哈希实现的 - 这就是名字的来源 - 但它们的本质隐藏在它们名称的后面。

不要被他们的名字搞糊涂;他们是完全不同的东西。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

HashMap 是添加,获取,删除...由任意类型的自定义键索引的对象。
HashSet 是添加元素,删除元素并通过比较其哈希值来检查元素是否存在。

因此HashMap包含元素,而HashSet会记住它们的哈希值。

答案 8 :(得分:1)

的差异: 关于heirarchy: HashSet实现了Set。 HashMap实现Map并存储键和值的映射。

对数据库使用HashSet和HashMap可以帮助您理解每个数据库的重要性。
HashSet:通常用于存储唯一的集合对象。 例如:它可以用作实现类,用于存储
之间的多对一关系 类项目和类别出价(项目有多个出价) HashMap:用于将键映射到value。值可以为null或Object的任何Object /列表(对象本身)。

答案 9 :(得分:1)

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;
}

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

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

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

这完全取决于Java中HashSet和HashMap的区别。总之,HashSet和HashMap是两种不同类型的Collection,一种是Set,另一种是Map。

答案 10 :(得分:1)

Java中HashSet和HashMap之间的差异

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

在Hashset / HashMap中作为键存储的对象应该覆盖hashcode&等于合同。

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

答案 11 :(得分:0)

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

编辑:为了解决马修的评论,他是对的;我倒退了。内部HashMap使用构成Set元素的Objects 键入。 HashMap的值是一个只是简单地存储在HashMap桶中的Object。

答案 12 :(得分:0)

HashSet是根据HashMap实施的。它是键和PRESENT对象之间的映射。

答案 13 :(得分:0)

HashMapMap实施,允许重复值,但不重复密钥。。要添加对象,需要键/值对。允许空值和空值。例如:

  

{The-→3,世界 - →5,是 - →2,nice-→4}

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

  

[在,世界,是,漂亮]

答案 14 :(得分:-1)

基本上在HashMap中,用户必须提供Key和Value,而在HashSet中只提供Value,Key是通过使用hash函数自动从Value派生的。因此,在拥有Key和Value之后,HashSet可以在内部存储为HashMap。

答案 15 :(得分:-1)

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

哈希集

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

HashMap

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

答案 16 :(得分:-1)

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

使其同步

Hashtables不允许空键并且已同步。

答案 17 :(得分:-1)

HashSet和HashMap都是存储对,不同之处在于,在HashMap中你可以在HashSet中指定一个键,键来自对象的哈希码

答案 18 :(得分:-1)

你几乎回答了自己的问题 - hashset不允许重复值。使用支持hashmap构建一个hashset(并且只是检查该值是否已经存在)将是微不足道的。我想各种java实现要么这样做,要么实现一些自定义代码来更有效地执行它。

答案 19 :(得分:-2)

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

的实现

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

Put方法用于在地图中添加元素 Add方法用于添加元素是Set

在哈希映射中,哈希码值使用密钥对象计算 这里的成员对象用于计算哈希码值,对于两个对象,哈希码值可以相同,因此如果返回false,则使用equal()方法检查相等性,这意味着两个对象不同。

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