HashSet和Set有什么区别?


81

看到像这样的代码片段

Set<Record> instances = new HashSet<Record>();

我想知道Hashset是否是一种特殊的设置。他们之间有什么区别吗?


8
您可能想看看接口
Nikita Rybak

Answers:


96

ASet代表通用的“一组值”。ATreeSet是对元素进行排序(并由此排序)HashSet的集合,a是对元素进行排序或排序的集合。

AHashSet通常比A快很多TreeSet

TreeSet通常将A实现为一棵红黑树(请参阅http://en.wikipedia.org/wiki/Red-black_tree-我尚未验证sun / oracle的实际实现TreeSet),而HashSet使用aObject.hashCode()在其中创建索引数组。红黑树的O(log(n))访问时间为HashSet,从恒定时间到最坏的情况(每个项目都具有相同的hashCode)的访问时间可以在其中进行线性搜索O(n)


此外,还有以下通用实现:LinkedHashSet(HashSet的变体,保留迭代器的某些顺序),ConcurrentSkipListSet(线程保存SortedSet的实现),CopyOnWriteArraySet(针对“大量读取而很少优化的线程安全变体”)写”),EnumSet(仅适用于元素的枚举类型,但比HashSet还要快)。
圣保罗Ebermann

7
@Erik:我要求编辑您的答案。TreeSet没有排序。HashSet =无序,TreeSet =已排序,LinkedHashSet =有序。请相应地修改您的答案
Rais Alam 2013年

如果hashCode的实现不好(例如,始终返回相同的哈希码),则Hashset可能会变慢
Romain Hautefeuille

34

HashSet是的一个实现Set


13
我不明白这个评论。问题是“有什么区别”,而不是“两者之间的关系”。
jambox

7
他解释了区别,Set是接口,HashSet是该接口的实现。因此,它们不是不同的实现,只是HashSet是Set的实现之一(另一个实现是TreeSet)。
AggieDev

听起来对我来说是个有效答案
Romain Hautefeuille

2
因为您根本没有回答问题,所以给您留下了挫败感。将来,我建议您添加一些文档,示例和比较。仅写一个句子,大部分内容只是到其他地方的链接,这不是您如何在Stack Overflow上回答问题的方法。
Urda

这个问题已经在6年前被回答了(见上文),但谢谢。
vaugham '18

16

这个问题已经回答了,但是我没有看到为什么代码在同一代码中同时提到两种类型的答案。

通常,您要针对在这种情况下为Set的接口进行编码。为什么?因为如果您始终通过接口引用对象(新的HashSet()除外),那么以后发现更改对象的实现会更方便,因为您发现这样做会更好,因为您在代码中只提到了一次基本(您在其中执行了新的HashSet())。


12

Set是一个不包含重复元素的集合。Set是一个接口。

HashSet实现Set由哈希表(实际上是HashMap实例)支持的接口。

因为HashSet是的特定实现之一Set接口。

ASet可以是以下任何一种,因为它是由以下类实现的

ConcurrentSkipListSet:基于的可伸缩并发NavigableSet实现ConcurrentSkipListMap。集合中的元素根据其自然顺序或Comparator在集合创建时通过提供的内容进行排序,具体取决于使用哪个构造函数。

CopyOnWriteArraySet:一个Set,它将内部CopyOnWriteArrayList用于其所有操作。

EnumSet :与枚举类型一起使用的专用Set实现。枚举集中的所有元素都必须来自创建集时显式或隐式指定的单个枚举类型。

TreeSet:基于TreeMap的NavigableSet实现。元素使用其自然顺序或在集合创建时提供的Comparator进行排序,具体取决于所使用的构造函数。

LinkedHashSet:Set接口的灰名单和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护贯穿其所有条目的双向链接列表。

但是HashSet只能是LinkedHashSet因为LinkedHashSet子类HashSet


8

Set是类似于set的集合的常规接口,而HashSet是Set接口的特定实现(使用哈希码,因此使用名称)。


2

Set是所有Set类(如TreeSet,LinkedHashSet等)的父接口。

HashSet是实现Set接口的类。


0

HashSet是派生自Set接口的类。作为Set的派生类,HashSet获得Set的属性。Set的重要且最常用的派生类是HashSet和TreeSet。


-1

**

  • 组:

**与LIST和QUEUE一样,它是Collection接口的子类型。

Set具有以下3个子类,用于存储多个对象而不重复。

  1. 哈希集
  2. 链接哈希集
  3. TreeSet(实现SortedSet接口)

**

  • 哈希集:

**

可以使用一个NULL值(因为不允许重复),数据由于不保持顺序而被随机存储。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.