Java 什么';HashSet和Set的区别是什么?

Java 什么';HashSet和Set的区别是什么?,java,interface,set,Java,Interface,Set,看到的代码片段如下 Set<Record> instances = new HashSet<Record>(); Set instances=newhashset(); 我想知道Hashset是否是一种特殊的集合。它们之间有什么区别吗?是一个集合的实现。集合是集合类集合的通用接口,而HashSet是集合接口的特定实现(它使用哈希代码,因此得名)。集合表示一个通用的“值集”。TreeSet是对元素进行排序(从而排序)的集合,HashSet是对元素不进行排序或排序的集合

看到的代码片段如下

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

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

是一个集合的实现。

集合是集合类集合的通用接口,而HashSet是集合接口的特定实现(它使用哈希代码,因此得名)。

集合表示一个通用的“值集”。
TreeSet
是对元素进行排序(从而排序)的集合,
HashSet
是对元素不进行排序或排序的集合

HashSet
通常比
TreeSet
快得多


TreeSet
通常实现为红黑树(请参阅-我尚未验证sun/oracle的
TreeSet
的实际实现),而
HashSet
使用
Object.hashCode()
在数组中创建索引。红黑树的访问时间是
O(log(n))
,而
HashSet
的访问时间从固定时间到最坏情况(每个项目都有相同的hashCode)不等,在这种情况下,可以有一个线性搜索时间
O(n)

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


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

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

通常,您希望针对在本例中设置的接口进行编码。为什么?因为如果总是通过接口引用对象(除了新的HashSet()),那么如果您发现这样做会更好,那么以后更改对象的实现就很简单了,因为您在代码库中只提到过一次(在这里您使用了新的HashSet())

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

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

因为
HashSet
Set
接口的具体实现之一

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

:基于
ConcurrentSkipListMap
的可扩展并发NavigableSet实现。集合的元素根据其自然顺序或集合创建时提供的
比较器保持排序,具体取决于使用的构造函数

:对其所有操作使用内部CopyOnWriteArrayList的集合

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

:基于树映射的NavigableSet实现。根据使用的构造函数,可以使用元素的自然顺序或在设置的创建时间提供的比较器对元素进行排序

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


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

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

**

  • 设置:
** 它是一个接口,是集合接口的一个子类型,就像列表和队列一样

集合有以下3个子类,用于存储多个不重复的对象

  • 哈希集
  • 链接数据集
  • TreeSet(实现SortedSet接口)
  • **

    • 哈希集:
    **


    可以使用一个空值(因为不允许重复),数据是随机存储的,因为它不保持顺序。

    您可能想了解的概念另外,还有以下通用实现:LinkedHashSet(保留迭代器某些顺序的HashSet的变体)、ConcurrentSkipListSet(threadsave SortedSet实现)、CopyOnWriteArraySet(针对“大量读取,很少写入”进行优化的线程安全变体)、EnumSet(仅适用于元素的枚举类型,但比HashSet更快)@Erik:我请求编辑您的答案。TreeSet是排序的而不是排序的。HashSet=Unordered,TreeSet=sorted,LinkedHashSet=ordered。请相应地修改您的答案。如果hashCode的实现不好(例如,总是返回相同的hashCode),HashSet可能会变慢。我不理解这个评论。问题是“有什么不同?”他解释了区别,Set是接口,HashSet是接口的实现。因此它们不是不同的实现,只是HashSet是Set的实现之一(另一个实现是TreeSet)。因为你根本没有回答这个问题,所以给你留下了否决票。以后我建议你添加一些文档、示例和比较。只写一句话,大部分内容只是指向其他地方的链接,而不是回答堆栈溢出问题的方式。这个问题在6年前已经得到了回答(见上文)但谢谢你。我不同意,在这种情况下,发布日期是一个相关的信息:因为当时(几年前)已经给出了完整的答案;没有更多的补充。这将是一个恶作剧,违反了SO的礼仪。如果你觉得缺少什么,请打开一个新的anwser并贡献。