191

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

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

4

20 回答 20

327

HashSet 是一个集合,例如{1,2,3,4,5}

HashMap是一个key -> value(key to value)映射,例如{a -> 1, b -> 2, c -> 2, d -> 1}

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

在 HashSet 中,不能有重复的元素。

于 2010-05-05T14:00:39.963 回答
175

它们是完全不同的构造。AHashMap是 的实现MapMap将键映射到值。使用散列进行密钥查找。

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

当您正在寻找最Collection适合您的目的时,本教程是一个很好的起点。如果你真的想知道发生了什么,也有一本书

于 2010-05-05T14:00:37.073 回答
71

哈希集

  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 
    

哈希映射

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

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 
    

请参阅本文以查找更多信息。

于 2015-09-05T00:50:23.967 回答
39

他们的名字都以Hash开头,真是太可惜了。这是其中最不重要的部分。正如其他人指出的那样,重要的部分出现在Hash - SetMap之后。它们分别是一个Set - 一个无序的集合 - 和一个Map - 一个带有键访问的集合。它们碰巧是用哈希实现的——这就是名称的来源——但它们的本质隐藏在它们名称的那部分后面。

不要被他们的名字所迷惑;它们是截然不同的东西。

于 2010-05-05T18:30:18.560 回答
6

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

  1. HashMap包含键值对,每个值都可以通过键访问,因为 HashSet 每次都需要迭代,因为没有 get 方法。
  2. HashMap实现 Map 接口,允许一个空值作为键,多个空值作为值,而HashSet实现 Set 接口,只允许一个空值,不允许重复值。(记住 HashMap 键中允许一个空键,因此 HashSet 中允许一个空值作为HashSet 在内部实现 HashMap)。
  3. HashSet并且HashMap在迭代时不要保持插入顺序。
于 2017-05-11T05:25:04.897 回答
5

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

于 2010-05-05T13:59:57.233 回答
4

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

于 2010-05-05T14:00:00.927 回答
2

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。

于 2013-02-05T09:26:12.743 回答
2

Java中HashSet和HashMap的区别

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

作为键存储在 Hashset/HashMap 中的对象应覆盖哈希码和等于合约。

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

于 2014-04-16T05:01:22.977 回答
1

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

编辑:为了解决马修的评论,他是对的;我倒过来了。内部 HashMap以组成 Set 元素的对象为键。HashMap 的值是一个简单地存储在 HashMap 存储桶中的对象。

于 2010-05-05T13:59:52.910 回答
1

AHashMap是添加、获取、删除……由任何类型的自定义键索引的对象。
AHashSet是添加元素,删除元素并通过比较它们的哈希来检查元素是否存在。

所以 HashMap 包含元素,而 HashSet 记住它们的哈希值。

于 2010-05-05T14:04:21.893 回答
1

区别:关于层次结构:HashSet 实现了 Set。HashMap 实现 Map 并存储键和值的映射。

在数据库中使用 HashSet 和 HashMap 将帮助您理解它们的重要性。
HashSet:一般用于存储唯一的集合对象。
例如:它可以用作实现类,用于存储类 Item 和 Class Bid 之间的多对一关系,其中(Item 有很多 Bids) HashMap:用于将键映射到值。值可以为 null 或任何 Object / 对象列表(本身就是对象)。

于 2010-05-05T18:22:37.417 回答
0

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

于 2010-05-05T13:59:05.240 回答
0

HashMap是一种Map实现,允许重复值不允许重复键。. 要添加对象,需要键/值对。允许使用 Null 键和 Null 值。例如:

{The->3,world->5,is->2,nice->4}

HashSet是一个Set实现,它不允许重复。如果你试图添加一个重复的对象,一个对public boolean add(Object o)方法的调用,那么集合保持不变并返回false。例如:

[这个,世界,是,美好的]

于 2016-01-24T15:23:43.027 回答
-1

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

于 2010-05-05T13:59:19.060 回答
-1

基本上在HashMap中,用户必须同时提供Key和Value,而在HashSet中你只提供Value,Key是通过使用哈希函数从Value自动派生的。所以有了 Key 和 Value 之后,HashSet 就可以在内部存储为 HashMap 了。

于 2011-08-07T06:50:44.337 回答
-1

HashSet 和 HashMap 都存储对,区别在于 HashMap 中可以指定一个键,而 HashSet 中的键来自对象的哈希码

于 2012-10-23T18:48:58.860 回答
-1

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

Hashtables不允许空键并且是同步的。

于 2013-04-04T12:01:25.187 回答
-1

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

哈希集

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

哈希映射

  • 它允许重复键。它不是同步的,因此这将具有更好的性能。
  • HashMap 不维护插入顺序。
  • 顺序由哈希函数定义。
  • 它不是线程安全的
  • 它允许键和值都为 null。
  • 它允许一个空键和任意多个空值。
  • HashMap 是 Map 接口的基于哈希表的实现。
  • HashMap 将对象存储为键值对。
  • HashMap 不允许重复键,但允许空键和值。
  • 元件的订购不能保证超时。
于 2020-12-23T18:21:21.757 回答
-2

HashMap 是 Map 接口的实现 HashSet 是 Set 接口的实现

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

put方法用于在map中添加元素 Add方法用于添加元素是Set

在 hash map 中,hashcode 值是使用 key 对象计算的 这里成员对象用于计算两个对象的 hashcode 值,因此 equal() 方法用于检查是否相等,如果它返回 false,则表示两个对象不同。

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

于 2015-05-04T14:31:58.707 回答