Module  java.base
软件包  java.util

Class LinkedHashSet<E>

  • 参数类型
    E - 由此集合维护的元素的类型
    All Implemented Interfaces:
    SerializableCloneableIterable<E>Collection<E>Set<E>


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

    哈希表和链表实现的Set接口,具有可预测的迭代次序。 该实现与HashSet不同之处在于它保持双向链接列表的所有条目。 该链表定义了迭代排序,它是将元素插入集合( 插入顺序的顺序 请注意,如果一个元件被重新插入到组插入顺序不受影响 (如果s.add(e)在调用之前s.contains(e)将立即返回truee被重新插入到集合s )。

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

      void foo(Set s) {
             Set copy = new LinkedHashSet(s);
             ...
         } 
    如果模块在输入上进行设置,复制它,并且稍后返回其顺序由该副本确定的结果,则此技术特别有用。 (客户一般都喜欢以相同的顺序返回事情。)

    此类提供所有可选的Set操作,并允许空元素。 HashSet ,它提供了基本操作(稳定的性能addcontainsremove ),假设散列函数散桶中适当的元件。 性能可能略低于HashSet ,由于维护链表的额外费用,除了一个例外:迭代超过LinkedHashSet需要与集合的大小成比例的时间,无论其容量如何。 HashSet迭代可能更昂贵,需要与其容量成比例的时间。

    链接哈希集具有影响其性能的两个参数: 初始容量负载因子 它们被精确定义为HashSet 但是,请注意,对于这个类别HashSet ,选择过高的初始容量值的惩罚不如HashSet那么严格,因为这个类的迭代次数不受容量的影响。

    请注意,此实现不同步。 如果多个线程同时访问链接的散列集,并且至少有一个线程修改该集合,那么它必须在外部进行同步。 这通常通过在自然地封装集合的一些对象上进行同步来实现。 如果没有这样的对象存在,那么该集合应该使用Collections.synchronizedSet方法“包装”。 这最好在创建时完成,以防止意外的非同步访问集:

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

    此类的iterator方法返回的迭代器是故障快速的 :如果在迭代器创建后的任何时间对该集合进行了修改,除了通过迭代器自己的remove方法之外,迭代器将抛出一个ConcurrentModificationException 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。

    请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速的迭代器ConcurrentModificationException扔出ConcurrentModificationException 因此,编写依赖于此异常的程序的正确性将是错误的: 迭代器的故障快速行为应仅用于检测错误。

    这个类是Java Collections Framework的成员。

    从以下版本开始:
    1.4
    另请参见:
    Object.hashCode()CollectionSetHashSetTreeSetHashtableSerialized Form
    • 构造方法详细信息

      • LinkedHashSet

        public LinkedHashSet​(int initialCapacity,
                             float loadFactor)
        构造具有指定的初始容量和负载因子的新的,空的链接散列集。
        参数
        initialCapacity - 链接散列集的初始容量
        loadFactor - 链接散列集的负载因子
        异常
        IllegalArgumentException - 如果初始容量小于零,或者负载因子是非正值的
      • LinkedHashSet

        public LinkedHashSet​(int initialCapacity)
        构造一个具有指定初始容量和默认负载因子(0.75)的新的,空的链接散列集。
        参数
        initialCapacity - LinkedHashSet的初始容量
        异常
        IllegalArgumentException - 如果初始容量小于零
      • LinkedHashSet

        public LinkedHashSet​()
        构造一个具有默认初始容量(16)和负载因子(0.75)的新的,空的链接散列集。
      • LinkedHashSet

        public LinkedHashSet​(Collection<? extends E> c)
        构造与指定集合相同的元素的新的链接散列集。 创建链接的哈希集合具有足以容纳指定集合中的元素的初始容量和默认负载因子(0.75)。
        参数
        c - c元素放入此集合的集合
        异常
        NullPointerException - 如果指定的集合为空