【问题标题】:What's the difference between HashSet and Set?HashSet 和 Set 有什么区别?
【发布时间】:2011-07-05 14:43:20
【问题描述】:

看到了sn-p之类的代码

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

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

【问题讨论】:

标签: java interface set


【解决方案1】:

Set 代表一个通用的“值集”。 TreeSet 是一个集合,其中元素已排序(并因此排序),HashSet 是其中元素排序或排序的集合。

HashSet 通常比 TreeSet 快很多。

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

【讨论】:

  • 此外,还有这些通用实现:LinkedHashSet(HashSet 的一个变体,它为迭代器保留了一些顺序)、ConcurrentSkipListSet(一个线程保存的 SortedSet 实现)、CopyOnWriteArraySet(一个优化的线程安全变体对于“大量读取,很少写入”),EnumSet(仅适用于元素的枚举类型,但比 HashSet 还要快)。
  • @Erik:我请求编辑您的答案。 TreeSet 是无序排序的。 HashSet = 无序,TreeSet = 排序,LinkedHashSet = 有序。请相应修改您的答案
  • 如果 hashCode 的实现不好(例如,总是返回相同的 hashcode),Hashset 可能会变慢
【解决方案2】:

HashSetSet 的实现。

【讨论】:

  • 我不明白这条评论。问题是“有什么区别”而不是“两者之间的关系是什么”。
  • 他解释了区别,Set是接口,HashSet是那个接口的实现。因此它们不是不同的实现,只是 HashSet 是 Set 的实现之一(另一个实现是 TreeSet)。
  • 给你投了反对票,因为你根本没有回答这个问题。以后我建议您添加一些文档、示例和比较。只写一个句子,大部分内容只是指向其他地方的链接,这不是你在 Stack Overflow 上回答问题的方式。
  • 这个问题已在 6 年前得到解答(见上文),但谢谢。
  • 我不同意,在这种情况下,发布日期是一条相关信息:因为当时(几年前)已经给出了完整的答案;没有什么要补充的了。这将是一个双倍的,它违反了 SO 的礼仪。如果您觉得缺少某些内容,请打开一个新的 anwser 并提供帮助。
【解决方案3】:

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

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

由于HashSetSet接口的具体实现之一。

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

ConcurrentSkipListSet:基于ConcurrentSkipListMap 的可扩展并发 NavigableSet 实现。集合的元素会根据其自然顺序或在集合创建时提供的Comparator 进行排序,具体取决于使用的构造函数。

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

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

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

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

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

【讨论】:

    【解决方案4】:

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

    通常,您希望针对在本例中为 Set 的接口进行编码。为什么?因为如果您总是通过接口引用您的对象(除了 new HashSet()),那么稍后如果您发现更改对象的实现会更好,因为您在代码中只提到过一次基础(你在哪里做了 new HashSet())。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            **

            • 设置:

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

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

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

            **

            • 哈希集:

            **

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

            【讨论】:

              猜你喜欢
              • 2011-01-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-25
              • 2016-08-08
              • 2013-04-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多