注目記事

【Javaコード入門】コレクションフレームワーク_⑧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 values() すべての値を取得

以下は、HashMapに要素をセットし、そのキー/値を順に出力する例です。

CollMap.java

  1. package com.example.mynavi.collection;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. public class CollMap {
  7.   public static void main(String[] args) {
  8.     Map<String, String> map = new HashMap<String, String>() {
  9.       {
  10.         put("パソコン", "personal computer");
  11.         put("エアコン", "air conditioner");
  12.         put("リモコン", "remote control");
  13.       }
  14.     };
  15.  
  16.     for (var str : map.keySet()) {
  17.       System.out.println(str + ":" + map.get(str));
  18.     // 結果:エアコン:air conditioner、パソコン:personal computer、リモコン:remote control
  19.     }
  20.  
  21.     for (var val : map.values()) {
  22.       System.out.println(val + ":" + map.get(val));
  23.     // 結果:air conditioner、personal computer、remote control
  24.     }
  25.  
  26.     System.out.println(map.containsKey("エアコン"));    // 結果:true
  27.     System.out.println(map.containsValue("tourconductor")); // 結果:false
  28.  
  29.     if (!map.isEmpty()) {
  30.       System.out.println("要素数は" + map.size() + "個です。");
  31.     // 結果:要素数は3個です。
  32.     }
  33.  
  34.     map.remove("パソコン");
  35.     System.out.println(map);
  36.     // 結果:{エアコン=air conditioner, リモコン=remote control}
  37.  
  38.     map.clear();
  39.     System.out.println(map);    // 結果:{}
  40.   }
  41. }

HashMapでは、キーを管理するために内部的に「ハッシュ表」と呼ばれる配列を持っています。要素を挿入する際にも、まずは、キーからハッシュ値を求め、その値に基づいて、ハッシュ表のどこに要素を挿入するかを決めるわけです。
その性質上、HashMapを利用する場合には、以下の点に注意してください。

(1)equals/hashCodeメソッドはまとめてオーバーライドする

HashMapでは、ハッシュ値を求めるためにhashCodeメソッドを利用しています。そして、hashCodeメソッドは「等価なオブジェクト同士では、同じ値を返す」というルールがあります。equalsメソッドをオーバーライドした(=等価ルールを変更した)場合には、必ずhashCodeメソッドもまとめてオーバーライドしてください。

(2)ハッシュ表のサイズを適切に設定する

キーのハッシュ値が重複した場合、HashMapはその要素をリンクリストとして管理します。リンクリストは検索効率は良くないデータ構造なので、ハッシュ値が重複すればするほど、HashMapの検索効率そのものが低下するということです。
そのため、HashMapでは要素の個数がハッシュ表に対して一定割合を超えると、ハッシュ表そのものを拡張しようとします。ArrayListでも触れたように、配列(ハッシュ表)の再割り当てはオーバーヘッドの高い処理です。よって、あらかじめ格納すべき要素の個数が予測できているならば、インスタンス化に際して、サイズを宣言しておくべきです。

  1. var map = new HashMap<String,String>(20);

ハッシュ表サイズの初期値は16で、デフォルトではその75%(12個)を超えたところで、ハッシュ表の拡張が実施されます。

コレクションフレームワーク_目次
コレクションフレームワーク
コレクションを初期化する
synchronizedList/synchronizedMap/synchronizedSetメソッド
ArrayListクラス
asListメソッド
toArrayメソッド
LinkedList
HashMap
TreeMap
NavigableMap
HashSet
ArrayDeque

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。