看到像这样的代码片段
Set<Record> instances = new HashSet<Record>();
我想知道Hashset是否是一种特殊的设置。他们之间有什么区别吗?
Answers:
ASet
代表通用的“一组值”。ATreeSet
是对元素进行排序(并由此排序)HashSet
的集合,a是对元素进行不排序或排序的集合。
AHashSet
通常比A快很多TreeSet
。
TreeSet
通常将A实现为一棵红黑树(请参阅http://en.wikipedia.org/wiki/Red-black_tree-我尚未验证sun / oracle的实际实现TreeSet
),而HashSet
使用aObject.hashCode()
在其中创建索引数组。红黑树的O(log(n))
访问时间为HashSet
,从恒定时间到最坏的情况(每个项目都具有相同的hashCode)的访问时间可以在其中进行线性搜索O(n)
。
Set是一个不包含重复元素的集合。Set是一个接口。
HashSet实现Set
由哈希表(实际上是HashMap
实例)支持的接口。
因为HashSet
是的特定实现之一Set
接口。
ASet
可以是以下任何一种,因为它是由以下类实现的
ConcurrentSkipListSet:基于的可伸缩并发NavigableSet实现ConcurrentSkipListMap
。集合中的元素根据其自然顺序或Comparator
在集合创建时通过提供的内容进行排序,具体取决于使用哪个构造函数。
CopyOnWriteArraySet:一个Set,它将内部CopyOnWriteArrayList用于其所有操作。
EnumSet :与枚举类型一起使用的专用Set实现。枚举集中的所有元素都必须来自创建集时显式或隐式指定的单个枚举类型。
TreeSet:基于TreeMap的NavigableSet实现。元素使用其自然顺序或在集合创建时提供的Comparator进行排序,具体取决于所使用的构造函数。
LinkedHashSet:Set接口的灰名单和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护贯穿其所有条目的双向链接列表。
但是HashSet
只能是LinkedHashSet
因为LinkedHashSet
子类HashSet