Java HashMapの使い方のサンプル

JavaのHashMapクラスの使い方のサンプルです。

確認環境
・Java 8

目次

HashMapクラス

  • 1つの変数で複数の値を保持できます。
  • 「キー(key)」と「値」の組み合わせを要素として持ちます。
    →キーからハッシュ値を取得してそれに対応する場所に値を格納します。
  • 「キー」は一意です。
  • キーは任意の文字列を使うことができます。連想配列といえます。
    →連想配列とは添字(キー)に文字列を使用できる配列です。
  • キーの重複は許されません。
  • キーの順序は保証されません。(←LinkedHashMap、TreeMapと違う点)
  • スレッドセーフではありません。
  • 以下はJava8 API仕様のHashMapクラスのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashMap.html

Mapインターフェース

  • HashMapクラスはMapインターフェースを実装しています。
  • HashMapクラスをインスタンス化する時、HashMapクラス独自のメソッドを使用しない限り、通常Mapインターフェイス型の変数に代入します。
  • HashMapクラスは、Mapインターフェースを実装しているので、Mapインターフェイスにあるメソッドを使用できます。
  • 以下はJava8 API仕様のMapインターフェースのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html

キーと値を追加する(putメソッド)

キーと値を追加するサンプルです。

package test1;
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", "青");
        System.out.println(color);//{a=赤, b=黄, c=青}
        
        color.put("b", "オレンジ");
        System.out.println(color);//{a=赤, b=オレンジ, c=青}
    }
 }

8行目は、HashMapクラスをインスタンス化してMapインターフェイス型の変数に代入しています。
→ジェネリクス<>でオブジェクトの中身はString,Stringであると宣言しています。
10-12行目は、putメソッドで要素を追加しています。
15行目は、既にあるキーを指定しています。上書きされます。

 

キーを指定して値を取得する(getメソッド)

キーを指定して値を取得するサンプルです。

package test1;
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", "青");

		System.out.println(color.get("a")); //赤
	}
 }

12行目は、getメソッドで要素の値を取得しています。

 

キーと値の集合を取得する(entrySetメソッド)

キーと値の集合を取得するサンプルです。

package test1;
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", "青");
		
		System.out.println(color.entrySet());//[a=赤, b=黄, c=青]
		
		for (Map.Entry<String, String> c1 : color.entrySet()) {
			System.out.println(c1.getKey());// a b c
			System.out.println(c1.getValue());// 赤 黄 青
		}
	}
 }

12,14行目は、entrySetメソッドでキーと値の集合を取得しています。
15行目は、getKeyメソッドでキーを取得しています。
16行目は、getValueメソッドでキーを取得しています。

 

キーの集合を取得する(keySetメソッド)

キーの集合を取得するサンプルです。

package test1;
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", "青");
		
		System.out.println(color.keySet());//[a, b, c]
		
		for (String c1 : color.keySet()) {
			System.out.println(c1);// a b c
		}
	}
 }

12,14行目は、keySetメソッドでキーの集合を取得しています。

 

値の集合を取得する(valuesメソッド)

値の集合を取得するサンプルです。

package test1;
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", "青");
		
		System.out.println(color.values());//[赤, 黄, 青]
		
		for (String c1 : color.values()) {
			System.out.println(c1);// 赤 黄 青
		}
	}
 }

12,14行目は、valuesメソッドで値の集合を取得しています。

 

要素数を取得する(sizeメソッド)

要素数を取得するサンプルです。

package test1;
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", "青");

		System.out.println(color.size());//3
	}
 }

12行目は、sizeメソッドで要素数を取得しています。

 

指定のキーがあるかを返す(containsKeyメソッド)

指定のキーがあるかを返すサンプルです。

package test1;
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", "青");
		
		System.out.println(color.containsKey("b"));//true
	}
 }

12行目は、containsKeyメソッドで指定のキーがあるかを取得しています。
ある場合trueです。

 

指定の値があるかを返す(containsValueメソッド)

指定の値があるかを返すサンプルです。

package test1;
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", "青");
		
		System.out.println(color.containsValue("黄"));//true
	}
 }

12行目は、containsValueメソッドで指定の値があるかを取得しています。
ある場合trueです。

 

中身が空かを返す(isEmptyメソッド)

中身が空かを返すサンプルです。

package test1;
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", "青");

		System.out.println(color.isEmpty());//false
	}
 }

12行目は、isEmptyメソッドで中身が空か取得しています。
空の場合trueです。

 

キーを指定して削除する(removeメソッド)

キーを指定して削除するサンプルです。

package test1;
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", "青");

		color.remove("a");
		System.out.println(color);//{b=黄, c=青}
	}
 }

12行目は、removeメソッドで指定の要素を削除しています。

 

すべての要素を削除する(clearメソッド)

すべての要素を削除するサンプルです。

package test1;
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", "青");

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

12行目は、clearメソッドですべての要素を削除しています。

 

メソッドの引数/戻り値がマップの場合

メソッドの引数と戻り値がマップの場合のサンプルです。

package test1;

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", "黄");
        
        Map<String, String> b = showResult(color);
    }
    
    private static Map<String, String> showResult(Map<String, String> c1) {

    	return c1;
    }
}

12行目は、呼び出し元のメソッドです。引数(実引数)にマップを指定しています。戻り値もマップです。
15行目は、定義されたメソッドです。引数(仮引数)にマップがあります。戻り値もマップです。(以下の図を参照)

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

 

マップの中にマップがあるサンプル

マップの中にマップがあるサンプルです。

package test1;
import java.util.HashMap;
import java.util.Map;

public class Test1 {
    public static void main(String[] args) {
        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"));//赤
        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
    }
 }

7行目は、マップの中にマップを定義しています。
19,20行目は、マップにマップを追加しています。
22-28行目は、getメソッドでマップの値を取得しています。

 

要素を順番に処理する(forEachメソッド)

forEachメソッドは、要素を順番に処理します。Java8で導入されました。

package test1;
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", "青");
        
        color.forEach((a,b) -> System.out.println(a+b));//a赤 b黄 c青
    }
 }

13行目は、forEachメソッドでマップの各値を取得しています。変数a以降はラムダ式です。
Java ラムダ式のサンプル

以下は、Java8 API仕様のHashMapクラスのforEachメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashMap.html#forEach-java.util.function.BiConsumer-

 

ハッシュ表のサイズ

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

以下は初期容量(サイズ)を20とした場合です。

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

以下は初期容量(サイズ)が100で負荷係数0.9とした場合です。

Map<String, String> color = new HashMap<>(100,0.9F);

関連の記事

Java ArrayListの使い方のサンプル
Java LinkedListの使い方のサンプル
Java LinkedHashMapの使い方のサンプル
Java TreeMapの使い方のサンプル
Java HashSetの使い方のサンプル
Java 拡張for文のサンプル
Java リストから配列を作成するサンプル(ArrayList)
Java 配列からリストを作成するサンプル(Arraysクラス)
Java 配列からリストを作成するサンプル(Collectionsクラス)

△上に戻る