Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

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を利用する場合には、以下の点に注意してください。

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

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

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

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

Map<String,String> map = new HashMap<String,String>(20);

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

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

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職