HashMap
キー/値のペアを表すマップ – HashMapクラスマップは、リストやセット、キューと異なり、キーと値の組み合わせで要素を管理します。HashMapは、マップの実装クラスの中でも最も基本的なクラスです。キーは重複できず、また順番を持ちません。
HashMapクラスで利用できるメソッドには、以下のようなものがあります。
| HashMapクラスの主なメソッド | |
|---|---|
| メソッド | 概要 |
| clear() | すべての要素を削除 |
| containsKey(Object key) | キーkeyがマップに含まれているかを判定 |
| containsValue(Object value) | 値valueがマップに含まれているかを判定 |
| get(Object key) | キーkeyに対応する値を取得 |
| isEmpty() | マップが空かを判定 |
| keySet() | すべてのキーを取得 |
| put(K key, V value) | 指定されたキー/値の組み合わせを追加 |
| remove(Object key) | 指定のキーを削除 |
| int size() | マップの要素数を取得 |
| Collection<V> values() | すべての値を取得 |
以下は、HashMapに要素をセットし、そのキー/値を順に出力する例です。
CollMap.java
package com.example.mynavi.collection;
import java.util.HashMap;
import java.util.Map;
public class CollMap {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>() {
{
put("パソコン", "personal computer");
put("エアコン", "air conditioner");
put("リモコン", "remote control");
}
};
for (String str : map.keySet()) {
System.out.println(str + ":" + map.get(str));
// 結果:エアコン:air conditioner、パソコン:personal computer、リモコン:remote control
}
for (String val : map.values()) {
System.out.println(val + ":" + map.get(val));
// 結果:air conditioner、personal computer、remote control
}
System.out.println(map.containsKey("エアコン")); // 結果:true
System.out.println(map.containsValue("tourconductor")); // 結果:false
if (!map.isEmpty()) {
System.out.println("要素数は" + map.size() + "個です。");
// 結果:要素数は3個です。
}
map.remove("パソコン");
System.out.println(map);
// 結果:{エアコン=air conditioner, リモコン=remote control}
map.clear();
System.out.println(map); // 結果:{}
}
}
HashMapでは、キーを管理するために内部的に「ハッシュ表」と呼ばれる配列を持っています。要素を挿入する際にも、まずは、キーからハッシュ値を求め、その値に基づいて、ハッシュ表のどこに要素を挿入するかを決めるわけです。
その性質上、HashMapを利用する場合には、以下の点に注意してください。
HashMapでは、ハッシュ値を求めるためにhashCodeメソッドを利用しています。そして、hashCodeメソッドは「等価なオブジェクト同士では、同じ値を返す」というルールがあります。equalsメソッドをオーバーライドした(=等価ルールを変更した)場合には、必ずhashCodeメソッドもまとめてオーバーライドしてください。
(2)ハッシュ表のサイズを適切に設定するキーのハッシュ値が重複した場合、HashMapはその要素をリンクリストとして管理します。リンクリストは検索効率は良くないデータ構造なので、ハッシュ値が重複すればするほど、HashMapの検索効率そのものが低下するということです。
そのため、HashMapでは要素の個数がハッシュ表に対して一定割合を超えると、ハッシュ表そのものを拡張しようとします。ArrayListでも触れたように、配列(ハッシュ表)の再割り当てはオーバーヘッドの高い処理です。よって、あらかじめ格納すべき要素の個数が予測できているならば、インスタンス化に際して、サイズを宣言しておくべきです。
Map<String,String> map = new HashMap<String,String>(20);
ハッシュ表サイズの初期値は16で、デフォルトではその75%(12個)を超えたところで、ハッシュ表の拡張が実施されます。






