模块 java.base
 java.util

类 LinkedHashSet<E>

类型参数:
E - 此集合维护的元素类型
所有已实现的接口:
Serializable , Cloneable , Iterable<E> , Collection<E> , Set<E>

public class LinkedHashSet<E> extends HashSet <E> implements Set <E>, Cloneable , Serializable

Set 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashSet 的不同之处在于它维护一个贯穿其所有条目的双向链表。此链表定义了迭代顺序,即元素插入集合的顺序 (插入顺序).请注意,插入顺序是not如果一个元素是受影响的重新插入进入集合。 (如果调用 s.add(e),则元素 e 将重新插入集合 s,而 s.contains(e) 将在调用前立即返回 true。)

此实现使其客户免受 HashSet 提供的未指定的、通常混乱的排序,而不会导致与 TreeSet 相关的增加成本。它可用于生成与原始集合具有相同顺序的集合的副本,而不管原始集合的实现如何:


   void foo(Set<String> s) {
     Set<String> copy = new LinkedHashSet<>(s);
     ...
   }
  
如果模块在输入中获取一个集合,复制它,然后返回其顺序由副本的顺序确定的结果,则此技术特别有用。 (客户通常喜欢按照物品呈现的相同顺序退货。)

此类提供所有可选的 Set 操作,并允许空元素。与 HashSet 一样,它为基本操作(addcontainsremove)提供恒定时间性能,假设散列函数将元素适当地分散在桶中。由于维护链接列表的额外费用,性能可能略低于 HashSet,但有一个例外:迭代 LinkedHashSet 需要的时间与size的集合,无论其容量如何。对 HashSet 的迭代可能会更昂贵,需要与其对应的时间capacity.

链接哈希集有两个影响其性能的参数:初始容量负载系数.它们的定义与 HashSet 一样。但是请注意,为此类选择过高的初始容量值的惩罚没有 HashSet 严重,因为此类的迭代时间不受容量的影响。

请注意,此实现不是同步的。 如果多个线程同时访问链接哈希集,并且至少有一个线程修改了该集,则它must 将在外部同步。这通常是通过同步一些自然封装集合的对象来实现的。如果不存在这样的对象,则应使用 Collections.synchronizedSet 方法“包装”该集合。这最好在创建时完成,以防止意外的不同步访问集合:

  Set s = Collections.synchronizedSet(new LinkedHashSet(...));

此类的 iterator 方法返回的迭代器是 fail-fast :如果在创建迭代器后随时以任何方式修改集合,除了通过迭代器自己的 remove 方法,迭代器将抛出 ConcurrentModificationException 。因此,面对并发修改,迭代器会快速干净地失败,而不是冒着在未来不确定的时间出现任意的、不确定的行为的风险。

请注意,无法保证迭代器的快速失败行为,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。

此类是 Java 集合框架 的成员。

自从:
1.4
参见:
  • 构造方法详细信息

    • LinkedHashSet

      public LinkedHashSet(int initialCapacity, float loadFactor)
      使用指定的初始容量和加载因子构造一个新的空链接哈希集。
      API 注意:
      要创建初始容量可容纳预期元素数量的 LinkedHashSet,请使用 newLinkedHashSet
      参数:
      initialCapacity - 链接哈希集的初始容量
      loadFactor - 链接哈希集的负载因子
      抛出:
      IllegalArgumentException - 如果初始容量小于零,或者负载因子为非正数
    • LinkedHashSet

      public LinkedHashSet(int initialCapacity)
      使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空链接哈希集。
      API 注意:
      要创建初始容量可容纳预期元素数量的 LinkedHashSet,请使用 newLinkedHashSet
      参数:
      initialCapacity - LinkedHashSet 的初始容量
      抛出:
      IllegalArgumentException - 如果初始容量小于零
    • LinkedHashSet

      public LinkedHashSet()
      使用默认初始容量 (16) 和加载因子 (0.75) 构造一个新的空链接哈希集。
    • LinkedHashSet

      public LinkedHashSet(Collection <? extends E > c)
      使用与指定集合相同的元素构造一个新的链接哈希集。创建的链接哈希集具有足以容纳指定集合中的元素的初始容量和默认加载因子 (0.75)。
      参数:
      c - 其元素要放入此集合中的集合
      抛出:
      NullPointerException - 如果指定的集合为空
  • 方法详情

    • spliterator

      public Spliterator <E > spliterator()
      在此集合中的元素上创建 late-bindingfail-fast Spliterator

      Spliterator 报告 Spliterator.SIZED Spliterator.DISTINCT ORDERED。实施应记录附加特征值的报告。

      指定者:
      spliterator 在接口 Collection<E>
      指定者:
      spliterator 在接口 Iterable<E>
      指定者:
      spliterator 在接口 Set<E>
      重写:
      spliterator 在类 HashSet<E>
      实现注意事项:
      该实现从集合的 Iterator 创建一个 late-binding 拆分器。拆分器继承了集合迭代器的 fail-fast 属性。创建的 Spliterator 还报告 Spliterator.SUBSIZED
      返回:
      a Spliterator 覆盖此集合中的元素
      自从:
      1.8
    • newLinkedHashSet

      public static <T> LinkedHashSet <T> newLinkedHashSet(int numElements)
      创建一个适合预期元素数量的新的空 LinkedHashSet。返回的集合使用默认的加载因子 0.75,它的初始容量通常足够大,因此可以在不调整集合大小的情况下添加预期数量的元素。
      类型参数:
      T - 新集合维护的元素类型
      参数:
      numElements - 预期的元素数量
      返回:
      新创建的集合
      抛出:
      IllegalArgumentException - 如果 numElements 为负
      自从:
      19