Java HashMapとMapの使い方のサンプル

JavaのHashMapとMapの使い方のサンプルです。

目次

仕組み HashMapとは / HashMapの特徴 / ハッシュ表のサイズ
  HashMapとMapの関係
取得 要素の追加と取得(put、get、for文、forEach)
  要素を検索(containsKeyとcontainsValueの違い)
  中身が空か、要素数を取得(isEmpty/size)
更新 要素を追加・更新(put/replace) / 要素を削除(remove/clear)
使用 メソッドの引数と戻り値がマップ / マップの中にマップを定義

HashMapとは

Map<String,String> color = new HashMap<>();
color.put("a", "赤");
color.put("b", "青");
System.out.println(color.get("a")); // 赤

1つの変数で複数のキーと値を保持できます。

上記はHashMapクラスをインスタンス化してMapインターフェイス型の変数に代入しています。
この変数colorは複数のキー(aとb)と値(赤と青)を持てるようになります。
<>はジェネリクスです。変数colorの各値はStringとStringのみセット可能です。

 

HashMapの特徴

HashMapの変数のイメージ

 

要素

各項目を要素(element)といいます。
1つの変数で複数の「キー」と「値」を保持します。
キーは、任意の文字列を使用できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
キーからハッシュ値を取得してそれに対応する場所に値を格納します。

 

キーの順序

キーの順序は保証されません。←LinkedHashMap、TreeMapと違う点です。

 

その他

キーは一意です。重複は許されません。
値の重複は可能です。
スレッドセーフではありません。

 

要素の追加と取得(put、get、for文、forEach)

putはキーと値を追加します。
getはキーを指定して値を取得します。
for文とforEachはループで要素を順に取得します。

import java.util.HashMap;
import java.util.Map;

public class Test1 {
  public static void main(String[] args) {
    Map<String, String> color = new HashMap<>();
    color.put("a", "赤"); // 要素の追加
    color.put("b", "黄");
    color.put("c", "青");

    // get (キーを指定して値を取得)
    System.out.println(color.get("a")); // 赤
    System.out.println(color.get("b")); // 黄
    System.out.println(color.get("c")); // 青

    // for文とentrySet (キーと値を取得)
    for (Map.Entry<String, String> c1 : color.entrySet()) {
      System.out.println(c1.getKey());// a b c
      System.out.println(c1.getValue());// 赤 黄 青
    }

    // for文とkeySet (キーを取得)
    for (String c1 : color.keySet()) {
      System.out.println(c1);// a b c
    }

    // for文とvalues (値を取得)
    for (String c1 : color.values()) {
      System.out.println(c1);// 赤 黄 青
    }

    // forEach (変数a以降はラムダ式)
    color.forEach((a, b) -> System.out.println(a + b));// a赤 b黄 c青
  }
}

 

要素を検索(containsKeyとcontainsValueの違い)

public boolean containsKey(Object key)
public boolean containsValue(Object value)

containsKeyメソッドは、指定のキーが存在する場合はtrueを、存在しない場合はfalseを返します。 containsValueメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。

  Map<String,String> color = new HashMap<>();
  color.put("a", "赤");
  color.put("b", "黄");
  color.put("c", "青");
		
  // containsKey
  System.out.println(color.containsKey("b")); // true (存在する)
  System.out.println(color.containsKey("z")); // false (存在しない)

  // containsValue
  System.out.println(color.containsValue("黄")); // true (存在する)
  System.out.println(color.containsValue("白")); // false (存在しない)

 

中身が空か、要素数を取得(isEmpty/size)

public boolean isEmpty()
public int size()

isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
sizeメソッドは、要素数を返します。

  Map<String,String> color = new HashMap<>();
  color.put("a", "赤");
  color.put("b", "黄");
  color.put("c", "青");
		
  System.out.println(color.isEmpty());//false (中身あり)
  System.out.println(color.size());//3 (要素数を表示)
  color.clear(); // すべての要素を削除
  System.out.println(color.isEmpty());//true (中身なし)
  System.out.println(color.size());//0 (要素数を表示)

 

要素を追加・更新(put/replace)

public V put(K key,V value)
public V replace(K key, V value)

putメソッドはキーが存在しない場合追加します。キーが存在する場合上書きします。
replaceメソッドはキーを指定して値を置き換えます。

  Map<String,String> color = new HashMap<>();
    
  // put (キーが存在しないので追加)
  color.put("a", "赤");
  color.put("b", "黄");
  System.out.println(color);//{a=赤, b=黄}
    
  // put (キーが存在するので更新)
  color.put("b", "オレンジ");
  System.out.println(color);//{a=赤, b=オレンジ}
    
  // replace (キーを指定して置き換え)
  color.replace("b", "シルバー");
  System.out.println(color);//{a=赤, b=シルバー}

 

要素を削除(remove/clear)

public V remove(Object key)
public void clear()

removeメソッドは指定の位置の要素を削除します。
clearメソッドはすべての要素を削除します。

  Map<String,String> color = new HashMap<>();
  color.put("a", "赤");
  color.put("b", "黄");
  color.put("c", "青");

  color.remove("a"); // 指定の要素を削除
  System.out.println(color);//{b=黄, c=青}

  color.clear(); // すべての要素を削除
  System.out.println(color);//{}

 

メソッドの引数と戻り値がマップ

  Map<String, String> color = new HashMap<>();
  color.put("a", "赤");
  color.put("b", "黄");
  Map<String, String> b = test2(color); // 呼び出し元(引数と戻り値はマップ)

// (呼び出し先)
  private static Map<String, String> test2(Map<String, String> c1) {
    return c1;
  }

4行目は、呼び出し元のメソッドです。引数(実引数)にマップを指定しています。戻り値もマップです。
7行目は、定義されたメソッドです。引数(仮引数)にマップがあります。戻り値もマップです。
・「test2(Map<String, String> c1」のMap<String, String> c1が引数の型と変数です。
・「private static Map<String, String>」のMap<String, String>が戻り値の型です。

呼び出し元のメソッドの引数の変数名(color)と定義されたメソッドの引数の変数名(c1)は異なっていても使用できます。

マップの中にマップを定義

  Map<String,Map<String,String>> map1 = new HashMap<>();//マップの中にマップ
        
  Map<String,String> map2 = new HashMap<>();
  map2.put("a", "赤");
  map2.put("b", "黄");
  map2.put("c", "青");
        
  Map<String,String> map3 = new HashMap<>();
  map3.put("x", "red");
  map3.put("y", "yellow");
  map3.put("z", "blue");
        
  map1.put("あ", map2); // マップにマップを追加
  map1.put("い", map3); // マップにマップを追加

  System.out.println(map1.get("あ"));//{a=赤, b=黄, c=青}
  System.out.println(map1.get("あ").get("a"));//赤 (getを2つ指定して取得)
  System.out.println(map1.get("あ").get("b"));//黄
  System.out.println(map1.get("あ").get("c"));//青
  System.out.println(map1.get("い").get("x"));//red
  System.out.println(map1.get("い").get("y"));//yellow
  System.out.println(map1.get("い").get("z"));//blue

 

HashMapとMapの関係

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

HashMapクラスはMapインターフェースを実装しています。

使用例

Map<String,String> a = new HashMap<>();

HashMapクラスをインスタンス化する時、HashMapクラス独自のメソッドを使用しない限り、Mapインターフェイス型の変数に代入することが多いです。
Mapインターフェイスにあるメソッドを使用できます。

以下はOracleのJava8 API仕様のMapインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html

 

ハッシュ表のサイズ

HashMap(int initialCapacity)
HashMap(int initialCapacity, float loadFactor)

HashMapは要素の数が増えると自動的にハッシュ表を拡張します。
デフォルトは、初期容量(サイズ)は16で負荷係数は0.75です。
これは要素の数は16個で全体の75%(12個)が使用されたら拡張するという意味です。
初期容量(サイズ)と負荷係数は設定することができます。

    Map<String, String> color1 = new HashMap<>(20);
    Map<String, String> color2 = new HashMap<>(100,0.9F);

1行目は、初期容量(サイズ)を20とした場合です。
2行目は、初期容量(サイズ)が100で負荷係数0.9とした場合です。

以下はOracleのJava8 API仕様のHashMapクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashMap.html

関連の記事

Java LinkedHashMapの使い方のサンプル
Java TreeMapの使い方のサンプル

△上に戻る