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

仕組み HashMapとは
HashMapの特徴
ハッシュ表のサイズ
  HashMapとMapインターフェースの関係
サンプル HashMapを使用するサンプル
取得 要素取得(get)
for文でキーと値を取得(entrySet)
for文でキーを取得(keySet)
for文で値を取得(values)
forEach+ラムダ式
  要素を検索し真偽値を返す(containsKey)
  要素を検索し位置を返す(containsValue)
  中身が空か(isEmpty)
  要素数を取得(size)
更新 要素を追加(put)
キーを指定して上書き(put)
キーを指定して上書き(replace)
指定の要素を削除(remove)
全ての要素を削除(clear)
使用 メソッドの引数と戻り値がマップ
マップの中にマップを定義

HashMapとは

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

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

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

 

HashMapの特徴

HashMapの変数のイメージ

 

要素

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

 

キーの順序

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

 

その他

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

 

HashMapを使用するサンプル

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("c1", "red");
		  color.put("c2", "yellow");
		  color.put("c3", "blue");
		  
		  System.out.println(color); //{c3=blue, c1=red, c2=yellow}
	}
}

6行目は、Mapインターフェイス型の変数にしています。
要素は、putで追加します。

 

要素取得(get)

getはキーを指定して値を取得します。

  Map<String, String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  System.out.println(color.get("c1")); // red
  System.out.println(color.get("c2")); // yellow
  System.out.println(color.get("c3")); // blue

 

for文でキーと値を取得(entrySet)

ループで要素を順に取得します。

  Map<String, String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  for (Map.Entry<String, String> c1 : color.entrySet()) {
    System.out.println(c1.getKey());// c3 c1 c2
    System.out.println(c1.getValue());// blue red yellow
  }

entrySetは、キーと値を取得します。

 

for文でキーを取得(keySet)

ループで要素を順に取得します。

  Map<String, String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  for (String c1 : color.keySet()) {
    System.out.println(c1);// c3 c1 c2
  }

keySetは、キーを取得します。

 

for文で値を取得(values)

ループで要素を順に取得します。

  Map<String, String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  for (String c1 : color.values()) {
    System.out.println(c1);// blue red yellow
  }

valuesは、値を取得します。

 

forEach+ラムダ式

ループで要素を順に取得します。

  Map<String, String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  color.forEach((a, b) -> System.out.println(a + b));//c3blue c1red c2yellow

変数a以降はラムダ式です。

 

要素を検索し真偽値を返す(containsKey)

public boolean containsKey(Object key)

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

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
		  
  System.out.println(color.containsKey("c2")); // true (存在する)
  System.out.println(color.containsKey("ZZ")); // false (存在しない)

 

要素を検索し位置を返す(containsValue)

public boolean containsValue(Object value)

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

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
		  
  System.out.println(color.containsValue("yellow")); // true (存在する)
  System.out.println(color.containsValue("ZZ")); // false (存在しない)

 

中身が空か(isEmpty)

public boolean isEmpty()

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

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
		  
  System.out.println(color.isEmpty()); //false (中身あり)
  color.clear(); // すべての要素を削除
  System.out.println(color.isEmpty()); //true (中身なし)
  System.out.println(color); //{}

 

要素数を取得(size)

public int size()

sizeメソッドは、要素数を返します。

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
		  
  System.out.println(color.size());//3

 

要素を追加(put)

public V put(K key,V value)

putメソッドはキーが存在しない場合追加します。

  Map<String,String> color = new HashMap<>();
		  
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
  System.out.println(color);//{c3=blue, c1=red, c2=yellow}

 

キーを指定して上書き(put)

public V put(K key,V value)

putはキーが存在する場合値を上書きします。

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
		  
  color.put("c2", "orange");
  System.out.println(color);//{c3=blue, c1=red, c2=orange}

 

キーを指定して上書き(replace)

public V replace(K key, V value)

replaceはキーを指定して値を上書きします。

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");
		  
  color.replace("c2", "orange");
  System.out.println(color);//{c3=blue, c1=red, c2=orange}

 

指定の要素を削除

public V remove(Object key)

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

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  color.remove("c1");
  System.out.println(color);//{c3=blue, c2=yellow}

 

全ての要素を削除(clear)

public void clear()

clearメソッドはすべての要素を削除します。

  Map<String,String> color = new HashMap<>();
  color.put("c1", "red");
  color.put("c2", "yellow");
  color.put("c3", "blue");

  color.clear();
  System.out.println(color);//{}

 

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

public class Test1 {
	public static void main(String[] args) {
		Map<String, String> m1 = new HashMap<>();
		m1.put("a", "red");
		m1.put("b", "blue");
		Map<String, String> m2 = getName(m1); //呼び出し元
		System.out.println(m2); //{a=red, b=blue}
	}
	private static Map<String, String> getName(Map<String, String> m1) {
		return m1;
	}
}

6行目は、呼び出し元のメソッドです。引数(実引数)にマップを指定しています。戻り値もマップです。
9行目は、定義されたメソッドです。引数(仮引数)にマップがあります。戻り値もマップです。
・getName(Map<String, String>)のMap<String, String>が引数の型です。その後のm1は変数です。
・static Map<String, String>のMap<String, String>が戻り値の型です。

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

 

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

  Map<String,Map<String,String>> map1 = new HashMap<>();//マップの中にマップ
	        
  Map<String,String> map2 = new HashMap<>();
  map2.put("1", "a");
  map2.put("2", "b");
  map2.put("3", "c");
		        
  Map<String,String> map3 = new HashMap<>();
  map3.put("4", "d");
  map3.put("5", "e");
  map3.put("6", "f");
		        
  map1.put("A", map2); // マップにマップを追加
  map1.put("B", map3); // マップにマップを追加

  System.out.println(map1.get("A"));//{1=a, 2=b, 3=c}
  System.out.println(map1.get("A").get("1"));//a (getを2つ指定して取得)
  System.out.println(map1.get("A").get("2"));//b
  System.out.println(map1.get("A").get("3"));//c
  System.out.println(map1.get("B"));//{4=d, 5=e, 6=f}
  System.out.println(map1.get("B").get("4"));//d
  System.out.println(map1.get("B").get("5"));//e
  System.out.println(map1.get("B").get("6"));//f

 

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の使い方のサンプル

△上に戻る