JAva.util.Map学習ノート

6627 ワード

概要
Mapは主にkey-valueペアを保存するために使用されます.1つのMapオブジェクトでは、同じkeyは許可されず、各keyは最大1つの値(value)にマッピングできます.Mapインタフェースは、主に抽象クラスjava.util.Dictionaryを置換するために使用される.
Mapインタフェースには、Mapオブジェクト内のすべてのkeyのセット、Mapオブジェクト内のすべてのvalueのセット、Mapオブジェクト内のすべてのインスタンス(entry)のセットの3つのコレクションビューが用意されています.Mapのインスタンスの順序は、mapオブジェクトの反復器がMapインスタンスのセットを巡回する順序と同じです.一方、いくつかのMapインタフェースの実装では、例えば、TreeMapは、Mapオブジェクトのインスタンスに対してソートアルゴリズムを提供し、HashMapは同様のメカニズムを提供しない.java.util.Setインタフェースと同様に、Mapインタフェースにおけるkeyに対する要求の一意性のため、修正中に生じる2つのkeyが等しい場合、Mapはこのkeyに対するmapの挙動に影響を及ぼす可能性があるため、1つの可変オブジェクトをMapのkeyとしないほうがよい.しかし、オブジェクトの変更がmapの他の操作に影響を与えないため、この可変オブジェクトをmapの値として存在することができます.
Mapインタフェースの実装では、一般的に2つの構築方法を提供する必要があります.デフォルトのパラメータなし構築方法、Mapパラメータ付き構築方法です.実際には、第2の構築方法の形式は、ユーザが任意のmapオブジェクトをコピーし、特定のタイプのmapオブジェクトを等価に生成することを可能にする.このインタフェースには、呼び出されたmapオブジェクトがこれらのメソッドをサポートしていない場合に、U n s p p p p p p p p o r t edOperationException例外が投げ出されるオプションのメソッドも定義されています.ユーザ呼び出しメソッドがmapオブジェクトに変更を加えない場合は、例外(強制的でない投げ出し)を投げ出すこともできます.
いくつかのmapインタフェースの実装はkeyおよびvalueに対していくつかの制限がある.たとえば、nullをkeyまたはvalueとして許可しない実装もあれば、その合法的なkeyおよびvalueのタイプを規定する実装もあります.不正なキーまたはvalueを挿入しようとすると、通常はNull PointerExceptionまたはClassCastExceptionの非チェック異常が放出されます.不正なkeyまたはvalueを検索すると、異常を投げ出したり、姉がfalseに戻したりする可能性があります.
多くの集合フレームワークにおける方法はequals法に基づいて実現される.たとえば、containsKey(Object key)は、mapオブジェクトにkey:kが条件(key==null ? k==null : key.equals(k))を満たす場合、trueを返し、そうでない場合falseを返すと宣言します.しかし、これは、メソッドが呼び出された場合に、空でないkeyに対してkey.equals(k)が呼び出されることを意味するものではありません.mapインタフェースの実装過程では、まず両者のハッシュ値が等しいかどうかを判断し、等しい場合はequalsを呼び出し、そうでない場合はfalseに直接戻るなど、一定の最適化を行うことができる.すなわち,集合インタフェースを実現する方法では,下位Objectが提供する方法を適切に利用してアルゴリズム効率を向上させることができる.
map定義の再帰呼び出しに基づく操作は、直接自己参照または間接自己参照の場合に失敗する可能性があります.これらの方法には,lone(),equals(),hashCode(),toString()が含まれる.mapインタフェースを実装する過程で,自己参照を検証することができるが,現在の実装ではこのようなメカニズムは提供されていない.
内部インタフェースの説明(Entry)
クラスの説明
Mapにはインスタンスが記録され、各インスタンスはキー値ペア(key-value pair)である.メソッドMap.entrySetが呼び出されると、Entryのセットが返されます.このセットを呼び出す反復器は、Mapに記録されたレコードを取得する唯一の方法である.また、これらのレコードオブジェクトは、そのセットを巡回する反復器の有効期間と同じである.すなわち、集合要素が反復されると、Map内のレコードが構造的に変更され、修正前に生成された反復器が汚れたデータを取得する可能性がある.
方法の紹介
K getKey();

現在のキー-値ペアのキーを返します.
V getValue();

現在のキー-値ペアの値を返します.対応関係がメソッドを呼び出すときに、反復器のremoveメソッドを使用して他のスレッドによってインスタンスを削除された場合、メソッドを呼び出すと、汚れたデータが返される可能性があります.
V setValue(V value);

現在のインスタンスの値を指定した値に置き換えます(オプション).同様に、このメソッドが呼び出されると、反復器のremoveメソッドを使用して他のスレッドによってインスタンスが削除され、呼び出されたメソッドは汚れたデータを返す可能性がある.
boolean equals(Object o);

2つのレコードが等しいかどうかを判断し、両者が等しい場合はtrueを返し、そうでない場合はfalseを返します.
2つのレコードe1e2が存在すると仮定し、以下の条件を満たす場合、両者は等しいことを表す.
e1.getKey()==null ? e2.getKey()==null : e1.getKey().equals(e2.getKey())
 
e1.getValue()==null ? e2.getValue()==null : e1.getValue().equals(e2.getValue())
int hashCode()

現在のレコードのハッシュ値を返します.ハッシュ値の計算方法は、keyのハッシュ値^valueのハッシュ値、null要素に対応するハッシュ値0です.
(e.getKey()==null   ? 0 : e.getKey().hashCode()) 
^
(e.getValue()==null ? 0 : e.getValue().hashCode())

メソッドの説明
int size();

現在のmapオブジェクトにkey-valueペアが含まれている数を返します.
boolean isEmpty();

現在のmapオブジェクトにkey-valueペアが含まれているかどうかを判断し、含まれている場合はtrueを返し、そうでない場合はfalseを返します.
boolean containsKey(Object key);

mapオブジェクトにkeyに等しいキーが含まれている場合はtrueを返します.そうでない場合はfalseを返します.等しいと判断される条件は、(key==null ? k==null : key.equals(k))(1つのmapオブジェクトにおいて、この条件を満たすkeyが最大1つ存在する)である.
boolean containsValue(Object value);

現在のmapオブジェクトにvalueと等しい値が含まれているか否かを判断し、その判定条件は:value==null ? v==null : value.equals(v)である.この操作は、ほとんどのmap実装では、mapオブジェクトのサイズと実行時間が線形に関係している.
V get(Object key);

mapのキー値keyに対応する値を返します.mapにkeyが含まれていない場合はnull(各mapにおいて、この条件を満たす値が最大1つ存在する)を返します.現在のmapオブジェクトがnullを値として許可している場合、返されるnullは、対応するkeyがmapオブジェクトに存在しないことを証明することはできません.mapオブジェクトでは、keyに対応する値がnullである可能性があります.この場合、2つのケースを区別するためにcontainsKeyを呼び出す必要がある場合がある.
V put(K key, V value);

mapオブジェクトでkeyとvalueの対応関係を作成して保存します(オプション).現在のmapにキーのキー値ペアがすでに存在する場合は、このキーに対応する値をvalueで置き換えます.1つのmapオブジェクトmについて、m.containsKey(k)がtrueを返すように呼び出された場合にのみ、mにキーkのキー値ペアが存在すると考えられる.キーが存在する場合は、対応する古い値を返します.そうでない場合はnullを返します.
V remove(Object key);

mapのキー値がkeyのキー値ペアを削除します(オプション).mapオブジェクトにkeyが含まれている場合は、対応する値を返します.そうでない場合はnullを返します.mapがnullを値として許可する場合、nullを返すことは、mapにキーのキー値ペアが存在しないことを必ずしも意味しない.メソッドが呼び出されると、mapオブジェクトにはキーのキー値ペアが1つも含まれません.
void putAll(Map extends K, ? extends V> m);

mのすべてのキー値ペアを現在のmapオブジェクトにコピーします(オプション).この方法の実行結果は、mに多く存在するキー値対k−vを遍歴し、各キー値対に対してput(k, v)メソッドを呼び出すことに相当する.本方法の実行中にmが同時構造変更されると、この方法は不確定な実行結果を生成する.
void clear();

mapオブジェクトのkey-valueペアをすべて削除します.メソッドを呼び出すと、mapオブジェクトにはインスタンスは含まれません.
Set keySet();

現在のmapオブジェクトに含まれるすべてのkeyを、重複要素を含まないセット(Set)を生成します.このセットは現在のmapオブジェクトによって維持されるため、現在のmapオブジェクトに対する操作は直接そのセットに反映され、逆も同様である.このkeyセットを反復するとmapオブジェクトが変更され(key反復器を持つスレッドを除く)、不確定な反復結果が生成されます.このコレクションでは、Iterator.remove、Set.remove、removeAll、retainAll、clearを使用して要素の削除操作を行うことができます.ただし、addおよびaddAll操作はサポートされていません.
Collection values();

現在のmapオブジェクトに含まれるすべてのvalueを、重複要素を含むコレクション(Collection)を生成します.mapオブジェクトによってもメンテナンスされ、その修正操作は互いに影響します.
Set> entrySet();

現在のmapオブジェクトに含まれるすべてのkey-valueペアを返し、Map.Entryのセットを生成します.
boolean equals(Object o);

2つのMapオブジェクトが等しいかどうかを判断します.Mapオブジェクトは1つの対応関係を表すため、2つのMapオブジェクトが同じ対応関係を含む場合、両者は等しいと考えられる.2つのmapオブジェクトm1m2が存在すると仮定し、m1.entrySet().equals(m2.entrySet())の場合、両者は等しいと考えられる.
int hashCode();

現在のmapオブジェクトのハッシュ値を返します.1つのMapオブジェクトのハッシュ値は、現在のオブジェクトに含まれるすべてのハッシュ値の和です.