public class LinkedHashSet
extends HashSet<E>
implements Set<E>, Cloneable, Serializable
java.lang.Object | ||||
↳ | java.util.AbstractCollection<E> | |||
↳ | java.util.AbstractSet<E> | |||
↳ | java.util.HashSet<E> | |||
↳ | java.util.LinkedHashSet<E> |
Set接口的哈希表和链表实现,具有可预测的迭代顺序。 这个实现与HashSet的不同之处在于它维护着一个双向链表,它贯穿其所有条目。 此链接列表定义迭代排序,即元素插入到集合中的顺序 ( 插入顺序 )。 请注意,如果一个元件被重新插入到组插入顺序不受影响 。 (如果s.contains(e)在调用之前立即返回true,则调用s.add(e)时,将元素e重新插入集合s。 )
该实施方案将客户从HashSet
提供的未指定的通常混乱的订单中HashSet
,而不会增加与TreeSet
相关的成本增加。 无论原始集合的实现如何,它都可用于生成与原始订单具有相同订单的集合的副本:
void foo(Set s) { Set copy = new LinkedHashSet(s); ... }This technique is particularly useful if a module takes a set on input, copies it, and later returns results whose order is determined by that of the copy. (Clients generally appreciate having things returned in the same order they were presented.)
该类提供所有可选的Set操作,并允许空元素。 像HashSet,它提供了基本操作(add,contains remove和)稳定的性能,假定散列函数散桶中适当的元件。 由于增加了维护链表的费用,性能可能仅略低于HashSet的性能,但有一个例外:在LinkedHashSet之上的迭代需要的时间与该组的大小成正比,而不管其容量如何。 迭代HashSet可能会更昂贵,需要时间与其容量成比例。
链接哈希集有两个影响其性能的参数: 初始容量和负载因子 。 它们的定义与HashSet完全相同 。 但是,请注意,对于此类,初始容量选择过高值的惩罚不如HashSet严重,因为此类的迭代时间不受容量影响。
请注意,此实现不同步。 如果多个线程同时访问链接的哈希集合,并且至少有一个线程修改了该集合,则它必须在外部同步。 这通常是通过在自然封装集合的某个对象上进行同步来完成的。 如果不存在这样的对象,则该组应该使用Collections.synchronizedSet
方法“包装”。 这最好在创建时完成,以防止意外的非同步访问:
Set s = Collections.synchronizedSet(new LinkedHashSet(...));
这个类的iterator方法返回的迭代器是快速失败的 :如果在迭代器创建后随时修改集合,除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException
。 因此,面对并发修改,迭代器快速而干净地失败,而不是在将来某个未确定的时间冒着任意的,非确定性的行为风险。
请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。 失败快速迭代器在尽力而为的基础上抛出ConcurrentModificationException 。 因此,编写一个依赖于此异常的程序是正确的: 迭代器的快速失败行为应仅用于检测错误。
本课是 Java Collections Framework的成员。
也可以看看:
Public constructors |
|
---|---|
LinkedHashSet(int initialCapacity, float loadFactor) 使用指定的初始容量和加载因子构造一个新的空链接哈希集。 |
|
LinkedHashSet(int initialCapacity) 使用指定的初始容量和默认加载因子(0.75)构造一个新的空链接哈希集。 |
|
LinkedHashSet() 使用默认初始容量(16)和加载因子(0.75)构造一个新的空链接哈希集。 |
|
LinkedHashSet(Collection<? extends E> c) 使用与指定集合相同的元素构造一个新的链接哈希集合。 |
Public methods |
|
---|---|
Spliterator<E> |
spliterator() 创建一个 late-binding和 快速故障 |
Inherited methods |
|
---|---|
From class java.util.HashSet
|
|
From class java.util.AbstractSet
|
|
From class java.util.AbstractCollection
|
|
From class java.lang.Object
|
|
From interface java.util.Set
|
|
From interface java.util.Collection
|
|
From interface java.lang.Iterable
|
LinkedHashSet (int initialCapacity, float loadFactor)
使用指定的初始容量和加载因子构造一个新的空链接哈希集。
Parameters | |
---|---|
initialCapacity |
int : the initial capacity of the linked hash set |
loadFactor |
float : the load factor of the linked hash set |
Throws | |
---|---|
IllegalArgumentException |
if the initial capacity is less than zero, or if the load factor is nonpositive |
LinkedHashSet (int initialCapacity)
使用指定的初始容量和默认加载因子(0.75)构造一个新的空链接哈希集。
Parameters | |
---|---|
initialCapacity |
int : the initial capacity of the LinkedHashSet |
Throws | |
---|---|
IllegalArgumentException |
if the initial capacity is less than zero |
LinkedHashSet (Collection<? extends E> c)
使用与指定集合相同的元素构造一个新的链接哈希集合。 链接哈希集创建时的初始容量足以容纳指定集合中的元素和默认加载因子(0.75)。
Parameters | |
---|---|
c |
Collection : the collection whose elements are to be placed into this set |
Throws | |
---|---|
NullPointerException |
if the specified collection is null |
Spliterator<E> spliterator ()
创建一个 late-binding和 快速故障 Spliterator
覆盖此组中的元素。
该Spliterator
报告SIZED
, DISTINCT
,并ORDERED
。 实施应记录附加特征值的报告。
Iterator
. The spliterator inherits the fail-fast properties of the set's iterator. The created Spliterator
additionally reports SUBSIZED
.Returns | |
---|---|
Spliterator<E> |
a Spliterator over the elements in this set |