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個)を超えたところで、ハッシュ表の拡張が実施されます。