モジュール 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とは異なります。 このリンク・リストは、反復順序を定義します。この順序は、要素がセットに挿入された順序です(挿入順)。 要素がセットに再挿入されても、挿入順は影響を受けません s.add(e)が呼び出された場合、呼出しの直前にs.contains(e)trueを返しても、要素eがセットsに再挿入されます。

この実装では、HashSetで提供される未指定(無秩序)の順序がクライアントで起きることはありません(TreeSetのように負荷が増えることもありません)。 この実装を使用することで、元のセットの実装にかかわらず、元のセットと同じ順序のコピーを作成できます。


     void foo(Set<String> s) {
         Set<String> copy = new LinkedHashSet<>(s);
         ...
     }
 
この技術は、モジュールが入力としてセットを取り、それをコピーし、順序がコピーの順序で決まる結果を返す場合に、特に役立ちます。 クライアントは一般的に、渡された順序で返されることを想定します。

このクラスは、オプションのSetオペレーションをすべて提供し、null要素を許容します。 HashSetと同じく、ハッシュ関数が複数のバケットに適切に要素を分散すると仮定して、基本のオペレーション(addcontains、およびremove)に一定時間のパフォーマンスを提供します。 パフォーマンスは、1つの例外を除いて、リンク・リストを保持する負荷が増えるために、HashSetのパフォーマンスより少し劣る傾向があります。LinkedHashSetの反復には、容量にかかわらず、セットのサイズに比例した時間が必要になります。 容量に比例した時間を必要とするので、HashSetの反復はさらに負荷が大きくなる傾向があります。

リンク・ハッシュ・セットには、パフォーマンスに影響を及ぼすパラメータが2つあります。初期容量負荷係数です。 これらは、HashSetについて正確に定義されています。 ただし、このクラスの反復回数は容量により影響を受けないので、初期容量に非常に高い値を選ぶことの負荷は、HashSetに比べて大きくはありません。

この実装はsynchronizedされません。 複数のスレッドが並行してリンク・ハッシュ・セットにアクセスし、それらのスレッドの少なくとも1つがセットを変更する場合には、外部でsynchronizedする必要があります これは通常、セットを自然にカプセル化する一部のオブジェクトでsynchronizedすることによって達成されます。 そのようなオブジェクトが存在しない場合は、Collections.synchronizedSetメソッドを使用してセットを「ラップ」することをお薦めします。 セットが誤ってsynchronizedなしでアクセスされるのを防ぐために、作成時に行うことをお薦めします。

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

このクラスのiteratorメソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremoveメソッド以外の方法でセットが変更されると、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。

通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。

このクラスは、Java Collections Frameworkのメンバーです。

導入されたバージョン:
1.4
関連項目:
Object.hashCode(), Collection, Set, HashSet, TreeSet, Hashtable, 直列化された形式
  • コンストラクタの詳細

    • 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 - 要素がこのセットに配置されるコレクション
      例外:
      NullPointerException - 指定されたコレクションがnullである場合
  • メソッドの詳細

    • spliterator

      public Spliterator<E> spliterator()
      このセット内の要素に対する遅延バインディングおよびフェイルファスト Spliteratorを作成します。

      Spliteratorは、Spliterator.SIZEDSpliterator.DISTINCTおよびORDEREDを報告します。 実装は、追加の特性値の報告をドキュメント化する必要があります。

      定義:
      spliterator、インタフェース: Collection<E>
      定義:
      spliterator、インタフェース: Iterable<E>
      定義:
      spliterator、インタフェース: Set<E>
      オーバーライド:
      spliterator、クラス: HashSet<E>
      実装上のノート:
      実装は、セットのIteratorから遅延バインディング・スプリッテレータを作成します。 スプリッテレータは、セットのイテレータのフェイルファスト・プロパティを継承します。 作成されたSpliteratorは、追加でSpliterator.SUBSIZEDを報告します。
      戻り値:
      このセット内の要素に対するSpliterator
      導入されたバージョン:
      1.8