HashSet和Set之间有什么区别?

时间:2011-02-28 08:39:46

标签: java interface set

看到像

这样的代码片段
Set<Record> instances = new HashSet<Record>();

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

8 个答案:

答案 0 :(得分:76)

Set表示通用的“值集”。 TreeSet是元素排序(因此排序)的集合,HashSet是元素排序或排序的集合。

HashSet通常比TreeSet快很多。

TreeSet通常被实现为红黑树(参见http://en.wikipedia.org/wiki/Red-black_tree - 我没有验证sun / oracle的TreeSet的实际实现),而{{1}使用HashSet在数组中创建索引。红黑树的访问时间为Object.hashCode(),而O(log(n))的访问时间范围从常量时间到最差情况(每个项目具有相同的hashCode),您可以在此处获得线性搜索时间{ {1}}。

答案 1 :(得分:30)

HashSetSet的实现。

答案 2 :(得分:14)

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

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

答案 3 :(得分:8)

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

答案 4 :(得分:4)

Set是一个不包含重复元素的集合。 Set是一个界面。

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

由于HashMapHashSet接口的特定实现之一。

Set可以是以下任何一种,因为它是由以下类

实现的

ConcurrentSkipListSet:基于Set的可扩展并发NavigableSet实现。集合的元素按照它们的自然顺序进行排序,或者根据设置的创建时间提供的ConcurrentSkipListMap进行排序,具体取决于使用的构造函数。

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

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

TreeSet:基于TreeMap的NavigableSet实现。元素按照它们的自然顺序排序,或者在创建时创建时提供的比较器,具体取决于使用的构造函数。

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

Comparator只有HashSet,因为LinkedHashSet子类LinkedHashSet

答案 5 :(得分:2)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

**

  • 设置:

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

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

  1. HashSet
  2. LinkedHashSet
  3. TreeSet(实现SortedSet接口)

**

  • HashSet:

**

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