LinkedHashSet
java.lang.Object
|—java.util.AbstractCollection<E&
|—|—java.util.AbstractSet<E&
|—|—|—java.util.HashSet<E&
|—|—|—|—java.util.LinkedHashSet<E&
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, Serializable
Set 接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。 该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。 请注意,如果将元素重新插入集合中,则插入顺序不受影响。 (如果 s.add(e) 被调用,而 s.contains(e) 将在调用之前立即返回 true,则元素 e 被重新插入到集合 s 中。)
此实现使其客户免于 HashSet 提供的未指定、通常混乱的排序,而不会增加与 TreeSet 相关的成本。 它可用于生成与原始集合具有相同顺序的集合的副本,而不管原始集合的实现如何:
void foo(Set s) {
Set copy = new LinkedHashSet(s);
...
}
如果模块在输入上获取一个集合,复制它,然后返回其顺序由复制的顺序确定的结果,则此技术特别有用。 (客户通常喜欢以与呈现相同的顺序返回物品。)
此类提供所有可选的 Set 操作,并允许 null 元素。 与 HashSet 一样,它为基本操作(添加、包含和删除)提供恒定时间性能,假设哈希函数在桶中正确地分散元素。 由于维护链表的额外费用,性能可能略低于 HashSet,但有一个例外:迭代 LinkedHashSet 所需的时间与集合的大小成正比,而不管其容量如何。 HashSet 的迭代可能会更昂贵,需要的时间与其容量成正比。
链接哈希集有两个影响其性能的参数:初始容量和负载因子。 它们的定义与 HashSet 一样。 但是请注意,对于此类而言,为初始容量选择过高值的惩罚不如 HashSet 严重,因为此类的迭代时间不受容量的影响。
请注意,此实现不同步。 如果多个线程同时访问一个链接的哈希集,并且至少有一个线程修改了该集,则它必须在外部同步。 这通常是通过在一些自然封装集合的对象上同步来完成的。 如果不存在这样的对象,则应使用 Collections#synchronizedSet 方法“wrapped”该集合。 这最好在创建时完成,以防止对集合的意外不同步访问:
Set s = Collections.synchronizedSet(new LinkedHashSet(...));
此类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间修改集合,除了通过迭代器自己的 remove 方法之外,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。
请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。
此类是 Java 集合框架的成员。
构造函数摘要
构造函数 | 描述 |
---|---|
LinkedHashSet() | 使用默认初始容量 (16) 和加载因子 (0.75) 构造一个新的空链接哈希集。 |
LinkedHashSet(int initialCapacity) | 使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空链接哈希集。 |
LinkedHashSet(int initialCapacity, float loadFactor) | 使用指定的初始容量和负载因子构造一个新的空链接哈希集。 |
LinkedHashSet(Collection<? extends E> c) | 使用与指定集合相同的元素构造一个新的链接哈希集。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
SpliteratorE | spliterator() | 在此集合中的元素上创建一个后期绑定和快速失败的拆分器。 |
从类 java.util.AbstractCollection 继承的方法 |
---|
addAll, containsAll, retainAll, toArray, toArray, toString |
从类 java.util.AbstractSet 继承的方法 |
---|
equals, hashCode, removeAll |
从接口 java.util.Collection 继承的方法 |
---|
parallelStream, removeIf, stream |
从类 java.util.HashSet 继承的方法 |
---|
add, clear, clone, contains, isEmpty, iterator, remove, size |
从接口 java.lang.Iterable 继承的方法 |
---|
forEach |
从类 java.lang.Object 继承的方法 |
---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
从接口 java.util.Set 继承的方法 |
---|
add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray |
构造函数详细信息
LinkedHashSet
public LinkedHashSet(int initialCapacity, float loadFactor)
使用指定的初始容量和负载因子构造一个新的空链接哈希集。
参数:
参数名称 | 参数描述 |
---|---|
initialCapacity | 链接哈希集的初始容量 |
loadFactor | 链接哈希集的负载因子 |
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalArgumentException | 如果初始容量小于零,或者负载因子为非正数 |
LinkedHashSet
public LinkedHashSet(int initialCapacity)
使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空链接哈希集。
参数:
参数名称 | 参数描述 |
---|---|
initialCapacity | LinkedHashSet 的初始容量 |
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalArgumentException | 如果初始容量小于零 |
LinkedHashSet
public LinkedHashSet()
使用默认初始容量 (16) 和加载因子 (0.75) 构造一个新的空链接哈希集。
LinkedHashSet
public LinkedHashSet(Collection<? extends E> c)
使用与指定集合相同的元素构造一个新的链接哈希集。 链接哈希集的初始容量足以容纳指定集合中的元素和默认加载因子 (0.75)。
参数:
参数名称 | 参数描述 |
---|---|
c | 将其元素放入此集合的集合 |
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果指定的集合为空 |
方法详情
spliterator
public SpliteratorE spliterator()
在此集合中的元素上创建一个后期绑定和快速失败的拆分器。
Spliterator 报告 Spliterator#SIZED、Spliterator#DISTINCT 和 ORDERED。 实施应记录附加特征值的报告。
指定者:
接口 CollectionE 中的分离器
指定者:
接口 IterableE 中的分离器
指定者:
接口 SetE 中的分离器
覆盖:
HashSetE 类中的拆分器
返回:
此集合中元素的拆分器