知っていると便利な章

4.6. Map

キーと値のペアで構成される要素を保持するインターフェースです。

『JDK1.4 API Javadoc より抜粋』---
キーを値にマッピングするオブジェクトです。
マップには、同一のキーを複数登録することはできません。
各キーは 1 つの値にしかマッピングできません。
---

キーと値のペアをエントリー(Entry)と呼びます。
各キーは1つの値のみマッピングします。各キーの重複は許可されません。
put、getやCollectionビューを取り出すentrySet、keySet、valuesなどが代表的なメソッドです。

以下のクラスがMapインターフェースを実装しています。

HashMap
ハッシュを使ったMapのデフォルト実装です。
要素数によらない高速な検索ができます。

Hashtable
HashMapとの違いは、同期化されていることです。
ただし、あえて使う理由はありません。
HashtableとVectorを参照してください。

TreeMap
2分木の一種であるRed-Black Treeを使ったSortedMapインターフェースの実装です。
キーが、自然順序もしくはコンストラクタに指定されたComparatorに従って、昇順にソートされた要素を持ちます。

LinkedHashMap
キーの挿入順を保持します。
コンストラクタの引数の指定によって、 挿入順ではなくアクセス順を保持することもできます。 デフォルトは挿入順です。

IdentityHashMap
キーの同一性判定が異なるHashMapです。
equals() ではなく「==」で同一性判定します。

WeakHashMap
HashMapとほとんど同じですが、キーが「弱参照」で保持されます。
このマップ以外のどこからもキーが参照されなくなると ガベージコレクションの対象になります。

Mapインターフェースを実装したそれぞれのクラスがどのように振る舞うか確認します。

// キー
String[] ccLTD = {"fr", "kr", "jp", "de", "za"};
// 値
String[] area = {"フランス", "韓国", "日本", "ドイツ", "南アフリカ"};

for (int i = 0; i < 5; i++) {
    exMap.put(ccLTD[i], area[i]);     // Map に要素を追加
}
System.out.println(exMap);          // Map の要素表示

結果はこのようになります。

HashMapとIdentityHashMapの違いを確認します。

Map map = new HashMap();
Integer i1 = new Integer(1); // 整数1を表すオブジェクト
Integer i2 = new Integer(1); // i1と値は同じだが別オブジェクト
map.put(i1, "1番目");
map.put(i2, "2番目");
map.get(i1);                 // 「2番目」が返る

HashMapであれば、2回のputメソッド呼び出しでは同一のキーへ値をマップしたことになるので、 最初の値が2番目の値で上書きされて最後のgetメソッドは「2番目」を返します。

Map map = new IdentityHashMap();
Integer i1 = new Integer(1); // 整数1を表すオブジェクト
Integer i2 = new Integer(1); // i1と値は同じだが別オブジェクト
map.put(i1, "1番目");
map.put(i2, "2番目");
map.get(i1);                 // 「1番目」が返る

IdentityHashMapでは、オブジェクトi1、i2は別物と見なされますので、 2番目のputメソッドで値が上書きされることなく最後のgetメソッドは「1番目」を返します。

Mapの使い分け方ですが、通常はHashMapを使っておけば大丈夫です。
順序が重要であればTreeMapを使います。
IdentityHashMapやWeakHashMapは特殊な用途に限られるのであまり使う機会はないでしょう。

< 前のページへ

Pagetop