HashSet和Set之间有什么区别?

use*_*949 69 java interface set

看到代码片段就像

Set<Record> instances = new HashSet<Record>();
Run Code Online (Sandbox Code Playgroud)

我想知道Hashset是否是一种特殊的集合.他们之间有什么区别?

Eri*_*rik 84

A Set表示通用的"值集".A TreeSet是元素排序(因此排序)HashSet的集合,a 是元素排序或排序的集合.

A HashSet通常比a快很多TreeSet.

A TreeSet通常被实现为红黑树(参见http://en.wikipedia.org/wiki/Red-black_tree - 我没有验证sun/oracle的实际实现TreeSet),而a HashSet用于Object.hashCode()创建索引数组.红黑树的O(log(n))访问时间是HashSet从恒定时间到最差情况(每个项目具有相同的hashCode)的访问时间,其中您可以具有线性搜索时间O(n).

  • @Erik:我要求编辑你的答案.TreeSet按顺序排序.HashSet =无序,TreeSet =已排序,LinkedHashSet =已排序.请相应修改您的答案 (5认同)

vau*_*ham 31

HashSet是一个实现Set.

  • 我不明白这个评论.问题是"有什么不同",而不是"它们之间的关系是什么". (7认同)
  • 他解释了区别,Set是接口,HashSet是该接口的实现.因此它们不是不同的实现,简单地说HashSet是Set的一个实现(另一个实现是TreeSet). (4认同)
  • 给你投了反对票,因为你根本没有回答这个问题。将来我建议您添加一些文档、示例和比较。只写一个句子,大部分内容只是指向其他地方的链接*不是*您如何回答 Stack Overflow 上的问题。 (3认同)
  • 这个问题已经在 6 年前得到了回答(见上文),但谢谢你。 (2认同)
  • 我不同意,在这种情况下,发布日期是相关信息:因为当时(几年前)已经给出了完整的答案;没有什么可补充的了。这将是一个双倍,这违反了 SO 的礼节。如果您觉得缺少某些东西,请打开一个新的 anwser 并做出贡献。 (2认同)

Rav*_*abu 16

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

HashSet实现了该Set接口,由一个哈希表(实际上是一个HashMap实例)支持。

因为HashSetSet接口的具体实现之一。

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

ConcurrentSkipListSet:基于ConcurrentSkipListMap. 集合的元素根据它们的自然顺序进行排序,或者Comparator按照集合创建时提供的顺序进行排序,具体取决于使用的构造函数。

CopyOnWriteArraySet:使用内部 CopyOnWriteArrayList 进行所有操作的 Set。

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

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

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

HashSet只能是LinkedHashSet因为LinkedHashSet子类HashSet


MeB*_*Guy 14

问题已得到解答,但我没有看到为什么代码在同一代码中提到两种类型的答案.

通常,您希望针对接口进行编码,在本例中为接口.为什么?因为如果你总是通过接口引用你的对象(除了新的HashSet()),那么如果你发现这样做会更好,那么改变对象的实现是微不足道的,因为你在代码中只提到过一次base(你在那里做了新的HashSet()).


小智 8

Set是类集合集合的通用接口,而HashSet是Set接口的特定实现(使用哈希码,因此名称).


Ume*_*cha 5

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

HashSet是一个实现Set接口的类。