模块  java.base
软件包  java.util

Class LinkedHashSet<E>

  • 参数类型
    E - 此集维护的元素类型
    实现的所有接口
    SerializableCloneableIterable<E>Collection<E>Set<E>

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

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

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

      void foo(Set s) {
             Set copy = new LinkedHashSet(s);
             ...
         } 
    如果模块在输入上获取集合,复制它,然后返回其顺序由副本确定的结果,则此技术特别有用。 (客户通常会欣赏按照提交的顺序返回的内容。)

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

    链接的哈希集有两个影响其性能的参数: 初始容量加载因子 它们的定义与HashSet 但请注意,对于此类,选择过高的初始容量值的惩罚要小于HashSet ,因为此类的迭代次数不受容量影响。

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

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

    此类的iterator方法返回的迭代器是快速失败的 :如果在创建迭代器之后的任何时间修改集合,除了通过迭代器自己的remove方法之外,迭代器将抛出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 - 如果指定的集合为null