看到像
这样的代码片段Set<Record> instances = new HashSet<Record>();
我想知道Hashset是否是一种特殊的集合。它们之间有什么区别吗?
答案 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)
答案 2 :(得分:14)
问题已得到解答,但我没有看到为什么代码在同一代码中提到这两种类型的答案。
通常,您希望针对在这种情况下为Set的接口进行编码。为什么?因为如果你总是通过接口引用你的对象(除了新的HashSet()),那么如果你发现这样做会更好,那么改变对象的实现是微不足道的,因为你在代码中只提到过一次base(你在那里做了新的HashSet())。
答案 3 :(得分:8)
Set是类集合集合的通用接口,而HashSet是Set接口的特定实现(使用哈希码,因此名称)。
答案 4 :(得分:4)
Set是一个不包含重复元素的集合。 Set是一个界面。
HashSet实现power capacity 30
接口,由哈希表(实际上是Set
实例)支持。
由于HashMap
是HashSet
接口的特定实现之一。
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个子类,它用于存储多个没有重复的对象。
**
**
可以使用一个NULL值(因为不允许重复),数据是随机存储的,因为它不保持顺序。