モジュール java.base
パッケージ java.util

クラスLinkedHashSet<E>

型パラメータ:
E - このセットで保持される要素の型
すべての実装されたインタフェース:
Serializable, Cloneable, Iterable<E>, Collection<E>, SequencedCollection<E>, SequencedSet<E>, Set<E>

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

Setインタフェースのハッシュ表およびリンク・リスト実装。検出順序は明確に定義されています。 この実装は、HashSetとは異なります。これは、すべてのエントリを経由して実行される二重リンク・リストを保持する点です。 このリンク・リストは、検出順序(反復順序)を定義します。これは、要素がセット(insertion-order)に挿入された順序です。 最も最近挿入された要素(最年長)が最初で、最も新しい要素が最後です。 要素がaddメソッドでセットにre-insertedの場合、出現順序は影響を受けません。 (s.contains(e)が呼出しの直前にtrueを返すときにs.add(e)が呼び出されると、eがセットsに再挿入されます。) このセットの逆順のビューは逆の順序で、最年少の要素が最初に表示され、最年長の要素が最後に表示されます。 セットにすでに存在する要素の出現順序は、addFirstおよびaddLastメソッドを使用して変更できます。

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


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

このクラスは、オプションのSetおよびSequencedSet操作をすべて提供し、null要素を許可します。 HashSetと同様、ハッシュ関数がバケット間で要素を適切に分散すると、基本操作(addcontainsおよびremove)に対して一定時間のパフォーマンスが提供されます。 リンク・リストを維持する追加コストが1つあるため、パフォーマンスはHashSetのパフォーマンスのわずかに下回る可能性があります: LinkedHashSetに対する反復には、その容量に関係なく、セットのsizeに比例した時間が必要です。 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
関連項目:
  • コンストラクタの詳細

    • 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 - 指定されたコレクションが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
    • newLinkedHashSet

      public static <T> LinkedHashSet<T> newLinkedHashSet(int numElements)
      予想される要素数に適した新しい空のLinkedHashSetを作成します。 返されるセットではデフォルトのロード係数0.75が使用され、初期容量は通常十分に大きいため、セットのサイズを変更せずに必要なファクタ数を追加できます。
      型パラメータ:
      T - 新しいセットによって保持される要素のタイプ
      パラメータ:
      numElements - 予想される要素数
      戻り値:
      新しく作成されたセット
      例外:
      IllegalArgumentException - numElementsが負の場合
      導入されたバージョン:
      19
    • addFirst

      public void addFirst(E e)
      このコレクションの最初の要素として要素を追加します (オプションの操作)。 この操作が正常に完了すると、指定された要素はこのコレクションのメンバーになり、発生順に最初の要素になります。

      このセットにすでに要素が含まれている場合は、最初に検出された順序になるように、必要に応じて再配置されます。

      定義:
      インタフェースSequencedCollection<E>内のaddFirst
      パラメータ:
      e - 追加する要素
      導入されたバージョン:
      21
    • addLast

      public void addLast(E e)
      このコレクションの最後の要素として要素を追加します (オプションの操作)。 この操作が正常に完了すると、指定された要素はこのコレクションのメンバーになり、最後の要素が出現順になります。

      このセットにすでに要素が含まれている場合は、最後に検出された順序になるように、必要に応じて再配置されます。

      定義:
      インタフェースSequencedCollection<E>内のaddLast
      パラメータ:
      e - 追加する要素。
      導入されたバージョン:
      21
    • getFirst

      public E getFirst()
      このコレクションの最初の要素を取得します。
      定義:
      インタフェースSequencedCollection<E>内のgetFirst
      戻り値:
      取得された要素
      例外:
      NoSuchElementException - このコレクションが空の場合
      導入されたバージョン:
      21
    • getLast

      public E getLast()
      このコレクションの最後の要素を取得します。
      定義:
      インタフェースSequencedCollection<E>内のgetLast
      戻り値:
      取得された要素
      例外:
      NoSuchElementException - このコレクションが空の場合
      導入されたバージョン:
      21
    • removeFirst

      public E removeFirst()
      このコレクションの最初の要素を削除して返します(オプションの操作)。
      定義:
      インタフェースSequencedCollection<E>内のremoveFirst
      戻り値:
      削除される要素
      例外:
      NoSuchElementException - このコレクションが空の場合
      導入されたバージョン:
      21
    • removeLast

      public E removeLast()
      このコレクションの最後の要素を削除して返します(オプションの操作)。
      定義:
      インタフェースSequencedCollection<E>内のremoveLast
      戻り値:
      削除される要素
      例外:
      NoSuchElementException - このコレクションが空の場合
      導入されたバージョン:
      21
    • reversed

      public SequencedSet<E> reversed()
      このコレクションの逆順viewを返します。 返されるビュー内の要素の出現順序は、このコレクション内の要素の出現順序の逆です。 逆の順序付けは、返されるビューのビュー・コレクションに含まれるすべての順序依存操作に影響します。 コレクション実装でこのビューの変更が許可されている場合、ベースとなるコレクションへの変更"ライトスルー"。 実装によっては、基礎となるコレクションに対する変更が、この逆方向ビューに表示される場合と表示されない場合があります。

      逆方向ビューへの変更は許可され、このセットに伝播されます。 また、このセットに対する変更は、逆方向ビューに表示されます。

      定義:
      インタフェースSequencedCollection<E>内のreversed
      定義:
      インタフェースSequencedSet<E>内のreversed
      戻り値:
      このコレクションの逆順ビュー(SequencedSetとして)
      導入されたバージョン:
      21