JavaTM 2
Platform
Std. Ed. v1.4.0

java.util
クラス LinkedHashSet

java.lang.Object
  |
  +--java.util.AbstractCollection
        |
        +--java.util.AbstractSet
              |
              +--java.util.HashSet
                    |
                    +--java.util.LinkedHashSet
すべての実装インタフェース:
Cloneable, Collection, Serializable, Set

public class LinkedHashSet
extends HashSet
implements Set, Cloneable, Serializable

予測可能な繰り返し順序を持つ Set インタフェースのハッシュテーブルとリンクリストの実装です。この実装は、すべての実装のエントリを経る二重のリンクリストを保持するという点で、HashSet とは異なります。リンクリストは、繰り返し順序を定義します。この順序は、要素がセットに挿入された順序です (挿入順) 。要素をセットに「再挿入」する場合、挿入順は影響を受けません。呼び出しの直前に、s.contains(e)true を返すときに s.add(e) が呼び出された場合、要素 e がセット s に再挿入されます。

この実装では、 TreeSet 関連の負担の増大を負わずに、HashSet による、無指定の一般には無秩序な順序からクライアントを守ります。この実装を使用して、当初のセットの実装にかかわらず、当初のセットと同じ順序を持つセットのコピーを生成することができます。

     void foo(Set m) {
         Set copy = new LinkedHashSet(m);
         ...
     }
モジュールが入力のセットを取得し、コピーして、コピーのセットが設定した順序の結果を返した場合、この技術は特に役立ちます。一般的に、クライアントは提示と同じ順序で返されることを評価します。

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

リンクハッシュセットには、パフォーマンスに影響を与える 「初期容量」 および 「負荷係数」 の 2 つのパラメータがあります。これらのパラメータは、HashSet について正確に定義されています。ただし、このクラスの繰り返し回数は容量により影響を受けないので、初期容量に非常に高い値を選んでも、このクラスではHashSet に比べてそれほど結果はひどくはありません。

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

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

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

通常、非同期の同時変更がある場合、確かな保証を行うことは不可能なので、反復子のフェイルファストの動作を保証することはできません。フェイルファスト反復子は最善努力原則に基づき、ConcurrentModificationException をスローします。したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。「反復子のフェイルファストの動作はバグを検出するためにのみ使用すべきです」

導入されたバージョン:
1.4
関連項目:
Object.hashCode(), Collection, Set, HashSet, TreeSet, Hashtable, 直列化された形式

コンストラクタの概要
LinkedHashSet()
          デフォルトの初期容量 (16) と負荷係数 (0.75) で新しい空のリンクハッシュセットを生成します。
LinkedHashSet(Collection c)
          指定されたコレクションと同じ要素により新しいリンクハッシュセットを生成します。
LinkedHashSet(int initialCapacity)
          指定された初期容量とデフォルトの負荷係数 (0.75) で新しい空のリンクハッシュセットを生成します。
LinkedHashSet(int initialCapacity, float loadFactor)
          指定された初期容量と負荷係数で新しい空のリンクハッシュセットを生成します。
 
クラス java.util.HashSet から継承したメソッド
add, clear, clone, contains, isEmpty, iterator, remove, size
 
クラス java.util.AbstractSet から継承したメソッド
equals, hashCode, removeAll
 
クラス java.util.AbstractCollection から継承したメソッド
addAll, containsAll, retainAll, toArray, toArray, toString
 
クラス java.lang.Object から継承したメソッド
finalize, getClass, notify, notifyAll, wait, wait, wait
 
インタフェース java.util.Set から継承したメソッド
add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray
 

コンストラクタの詳細

LinkedHashSet

public LinkedHashSet(int initialCapacity,
                     float loadFactor)
指定された初期容量と負荷係数で新しい空のリンクハッシュセットを生成します。

パラメータ:
initialCapacity - リンクハッシュセットの初期容量
loadFactor - リンクハッシュセットの負荷係数
例外:
IllegalArgumentException - 初期容量が 0 より小さいか、負荷係数が正の値ではない場合

LinkedHashSet

public LinkedHashSet(int initialCapacity)
指定された初期容量とデフォルトの負荷係数 (0.75) で新しい空のリンクハッシュセットを生成します。

パラメータ:
initialCapacity - LinkedHashSet の初期容量
例外:
IllegalArgumentException - 初期容量が 0 より小さい場合

LinkedHashSet

public LinkedHashSet()
デフォルトの初期容量 (16) と負荷係数 (0.75) で新しい空のリンクハッシュセットを生成します。


LinkedHashSet

public LinkedHashSet(Collection c)
指定されたコレクションと同じ要素により新しいリンクハッシュセットを生成します。指定されたコレクションとデフォルトの負荷係数 (0.75) で要素を保持するのに十分な初期容量により、リンクハッシュセットが作成されます。

パラメータ:
c - 要素がセットに配置されるコレクション
例外:
NullPointerException - 指定されたコレクションが null である場合

JavaTM 2
Platform
Std. Ed. v1.4.0

バグの報告と機能のリクエスト
これ以外の API リファレンスおよび開発者用ドキュメントについては、 Java 2 SDK SE 開発者用ドキュメントを参照してください。 開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、 およびコード実例が含まれています。

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.