CDC 1.1.2

java.util
クラス LinkedHashMap

java.lang.Object
  上位を拡張 java.util.AbstractMap
      上位を拡張 java.util.HashMap
          上位を拡張 java.util.LinkedHashMap
すべての実装されたインタフェース:
Serializable, Cloneable, Map

public class LinkedHashMap
extends HashMap

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

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

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

特別なコンストラクタが、リンクハッシュマップ作成のため提供されます。このマップの繰り返し順序は、最後にエントリにアクセスした順序になります。順序はもっとも前にアクセスしたものから始まり、もっとも後にアクセスしたもので終わります (アクセス順)。この種のマップは、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 をスローします。したがって、並行して変更が行われると、Iterator は、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。

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

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

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

コンストラクタの概要
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

CDC 1.1.2

Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. Use of this specification is subject to license terms.