JavaTM 2
Platform
Std. Ed. v1.4.0

java.util
クラス LinkedHashMap

java.lang.Object
  |
  +--java.util.AbstractMap
        |
        +--java.util.HashMap
              |
              +--java.util.LinkedHashMap
すべての実装インタフェース:
Cloneable, Map, Serializable

public class LinkedHashMap
extends HashMap

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

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

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

特別な constructor が、リンクハッシュマップ作成のため提供されます。このマップの繰り返し順序は、最後にエントリにアクセスした順序になります。順序はもっとも前にアクセスしたものから始まり、もっとも後にアクセスしたもので終わります(アクセス順)。この種のマップは、LRU キャッシュを構築するのに最適です。put または get メソッドを呼び出すと、対応するエントリにアクセスします(呼び出し完了後に、対応するエントリがあると仮定します)。キー値マッピングが指定されたマップのエントリセット反復子により提供される順序で、putAll メソッドは、指定されたマップのマッピングごとにエントリアクセスを 1 つ生成します。エントリアクセスを生成するメソッドは他にありません。特にはコレクションビューに対するオペレーションは、元になるマップの繰り返し順序には影響を与えません。

マップに新しいマッピングを追加するとき、自動的に無効なマッピングを削除するポリシーを規定するために、removeEldestEntry(Map.Entry) メソッドがオーバーライドされる場合があります。

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

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

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

    Map m = Collections.synchronizedMap(new LinkedHashMap(...));
構造的な変更は、 1 つまたは複数のマッピングを追加または削除し、リンクハッシュマップがアクセス順の場合は、繰り返しの順序に影響を与えるオペレーションです。リンクハッシュマップが挿入順の場合は、マップに格納済みのキーに関連する値を単に変更することは、構造の修正ではありません。リンクハッシュマップがアクセス順の場合は、get によりマップを単に照会することは、構造の変更になります。)

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

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

導入されたバージョン:
JDK1.4
関連項目:
Object.hashCode(), Collection, Map, HashMap, TreeMap, Hashtable, 直列化された形式

入れ子クラスの概要
 
クラス java.util.Map から継承した入れ子クラス
Map.Entry
 
コンストラクタの概要
LinkedHashMap()
          デフォルトの容量 (16) と負荷係数 (0.75) で空の挿入順 LinkedHashMap インスタンスを作成します。
LinkedHashMap(int initialCapacity)
          指定された初期容量とデフォルトの負荷係数 (0.75) で空の挿入順 LinkedHashMap インスタンスを作成します。
LinkedHashMap(int initialCapacity, float loadFactor)
          指定された初期容量と負荷係数で空の挿入順 LinkedHashMap インスタンスを作成します。
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
          指定された初期容量、負荷係数、および順序モードで、空の LinkedHashMap インスタンスを作成します。
LinkedHashMap(Map m)
          指定された Map と同じマッピングで挿入順の LinkedHashMap インスタンスを作成します。
 
メソッドの概要
 void clear()
          すべてのマッピングをマップから削除します。
 boolean containsValue(Object value)
          マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。
 Object get(Object key)
          マップが指定のキーをマップする値を返します。
protected  boolean removeEldestEntry(Map.Entry eldest)
          このマップが一番古いエントリを削除する場合、true を返します。
 
クラス java.util.HashMap から継承したメソッド
clone, containsKey, entrySet, isEmpty, keySet, put, putAll, remove, size, values
 
クラス java.util.AbstractMap から継承したメソッド
equals, hashCode, toString
 
クラス java.lang.Object から継承したメソッド
finalize, getClass, notify, notifyAll, wait, wait, wait
 
インタフェース java.util.Map から継承したメソッド
equals, hashCode
 

コンストラクタの詳細

LinkedHashMap

public LinkedHashMap(int initialCapacity,
                     float loadFactor)
指定された初期容量と負荷係数で空の挿入順 LinkedHashMap インスタンスを作成します。

パラメータ:
initialCapacity - 初期容量
loadFactor - 負荷係数
例外:
IllegalArgumentException - 初期容量が負であるか、負荷係数が正ではない場合

LinkedHashMap

public LinkedHashMap(int initialCapacity)
指定された初期容量とデフォルトの負荷係数 (0.75) で空の挿入順 LinkedHashMap インスタンスを作成します。

パラメータ:
initialCapacity - 初期容量
例外:
IllegalArgumentException - 初期容量が負の場合

LinkedHashMap

public LinkedHashMap()
デフォルトの容量 (16) と負荷係数 (0.75) で空の挿入順 LinkedHashMap インスタンスを作成します。


LinkedHashMap

public LinkedHashMap(Map m)
指定された Map と同じマッピングで挿入順の LinkedHashMap インスタンスを作成します。LinkedHashMap インスタンスは、指定された Map のマッピングを保持するのに十分なデフォルトの負荷係数 (0.75) 、および初期容量で作成されます。

パラメータ:
m - マッピングがこのマップに配置されるマップ
例外:
NullPointerException - 指定されたマップが null の場合

LinkedHashMap

public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder)
指定された初期容量、負荷係数、および順序モードで、空の LinkedHashMap インスタンスを作成します。

パラメータ:
initialCapacity - 初期容量
loadFactor - 負荷係数
accessOrder - 順序モード。アクセス順なら true。挿入順ならfalse
例外:
IllegalArgumentException - 初期容量が負であるか、負荷係数が正ではない場合
メソッドの詳細

containsValue

public boolean containsValue(Object value)
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。

定義:
インタフェース Map 内の containsValue
オーバーライド:
クラス HashMap 内の containsValue
パラメータ:
value - マップにあるかどうかを判定される値
戻り値:
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合は true

get

public Object get(Object key)
マップが指定のキーをマップする値を返します。マップがこのキーのマッピングを保持していない場合は null を返します。戻り値の null は、マップがキーのマッピングを保持していないことを示すとはかぎりません。つまり、マップが明示的にキーを null にマップすることもあります。containsKey オペレーションを使うと、こうした 2 つの場合を見分けることができます。

定義:
インタフェース Map 内の get
オーバーライド:
クラス HashMap 内の get
パラメータ:
key - 関連付けられた値が返されるキー
戻り値:
マップが指定されたキーをマップする値
関連項目:
HashMap.put(Object, Object)

clear

public void clear()
すべてのマッピングをマップから削除します。

定義:
インタフェース Map 内の clear
オーバーライド:
クラス HashMap 内の clear

removeEldestEntry

protected boolean removeEldestEntry(Map.Entry eldest)
このマップが一番古いエントリを削除する場合、true を返します。新しいエントリをマップに挿入すると、put および putAll によりこのメソッドが呼び出されます。新しいエントリが追加されるたびに、このメソッドは一番古いエントリを削除する機会を実装側に提供します。これは、マップがキャッシュを表す場合に有効です。それにより、無効になったエントリを削除して、マップがメモリ消費を低減することができます。

サンプル使用: このオーバーライドにより、マップがエントリを最大100まで増加させることができ、エントリ数 100 の定常状態を維持して、新しいエントリが追加されるたびに一番古いエントリを削除することができます。

     private static final int MAX_ENTRIES = 100;
     protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
     }

通常このメソッドはマップを修正しません。代わりに、戻り値の指示通りにマップにマップ自体を修正させます。このメソッドがマップを直接修正できるようにします。ただし、修正した場合は、false を返す必要があります。これは、マップがそれ以上の修正を試みないことを示します。このメソッド内からのマップ修正後に true を返す効果は未指定です。

この実装は、false を返すだけです。そのため、このマップは通常のマップのように作用します。一番古い要素は削除されません。

パラメータ:
eldest - もっとも前にマップに挿入されたエントリ。または、マップがアクセス順の場合、もっとも前にアクセスしたエントリ。このメソッドが true を返す場合、こうしたエントリは削除されるエントリです。マップが、こうした呼び出しを招く put または putAll の呼び出し前に空になっている場合、こうしたエントリは挿入されたエントリになります。つまり、マップに単一のエントリが格納される場合、一番古いエントリが一番新しいエントリにもなります。
戻り値:
一番古いエントリがマップから削除された場合は true。それが保持される場合は false

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.