JavaTM Platform
Standard Ed. 6

java.util
クラス LinkedHashMap<K,V>

java.lang.Object
  上位を拡張 java.util.AbstractMap<K,V>
      上位を拡張 java.util.HashMap<K,V>
          上位を拡張 java.util.LinkedHashMap<K,V>
型パラメータ:
K - このマップで保持されるキーの型
V - マップされる値の型
すべての実装されたインタフェース:
Serializable, Cloneable, Map<K,V>

public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>

 

予測可能な繰り返し順序を持つ 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 をスローします。このように、並行して変更が行われると、反復子は、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。  

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

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

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

入れ子のクラスの概要
 
クラス java.util.AbstractMap から継承された入れ子のクラス/インタフェース
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
 
コンストラクタの概要
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<? extends K,? extends V> m)
          指定された Map と同じマッピングで挿入順の LinkedHashMap インスタンスを作成します。
 
メソッドの概要
 void clear()
          すべてのマッピングをマップから削除します。
 boolean containsValue(Object value)
          マップが 1 つまたは複数のキーと指定された値をマッピングしている場合に true を返します。
 V get(Object key)
          指定されたキーがマップされている値を返します。
protected  boolean removeEldestEntry(Map.Entry<K,V> 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 から継承されたメソッド
containsKey, entrySet, equals, hashCode, isEmpty, keySet, put, putAll, remove, size, values
 

コンストラクタの詳細

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<? extends K,? extends V> 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<K,V> 内の containsValue
オーバーライド:
クラス HashMap<K,V> 内の containsValue
パラメータ:
value - マップにあるかどうかを判定される値
戻り値:
マップが 1 つまたは複数のキーと指定された値をマッピングしている場合は true

get

public V get(Object key)
指定されたキーがマップされている値を返します。そのキーのマッピングがこのマップに含まれていない場合は null を返します。  

つまり、このメソッドは、(key==null ? k==null : key.equals(k)) となるキー k から値 v へのマッピングがこのマップに含まれている場合は v を返し、それ以外の場合は null を返します。このようなマッピングが 1 つだけあります。  

戻り値の null は、マップがキーのマッピングを保持していないことを示すとはかぎりません。 つまり、マップが明示的にキーを null にマップすることもあります。containsKey オペレーションを使うと、この 2 つの場合を区別できます。

定義:
インタフェース Map<K,V> 内の get
オーバーライド:
クラス HashMap<K,V> 内の get
パラメータ:
key - 関連付けられた値が返されるキー
戻り値:
指定されたキーがマップされている値。そのキーのマッピングがこのマップに含まれていない場合は null
関連項目:
HashMap.put(Object, Object)

clear

public void clear()
すべてのマッピングをマップから削除します。この呼び出しが戻ると、マップは空になります。

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

removeEldestEntry

protected boolean removeEldestEntry(Map.Entry<K,V> 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 Platform
Standard Ed. 6

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

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。