バナー画像

Javaについても配列操作は比較的初期の段階で学習する項目の一つですが、今回はこの配列操作のうち「HashMapクラスを使って連想配列を操作する」方法について解説していきます。

Mapインターフェース

JavaにはMapというインターフェースが存在します。

このMapインターフェースはキーを値にマッピングするオブジェクトです。Mapには同一のキーを複数登録できません。また各キーは1つの値にしかマッピングできません。

連想配列を扱うためにはこのMapインターフェースを実装しているTreeMapクラスやHashMapクラス、LinkedHashMapクラスを使用します。

クラスの特徴

Mapインターフェースの中にはHashMapクラスの他、TreeMapクラスやLinkedHashMapクラスがあることは先ほどもご説明しましたが、まずはこれらの違いについてまとめておきます。

クラスの特徴
  • HashMapクラスはキーからハッシュ値を算出して管理するため、順序は保証されない
  • TreeMapクラスはキーによってソートされるため、順序を保証する
  • LinkedHashMapクラスはデフォルトでは挿入された順番を保持するが、コンストラクタの第3引数にtrueを設定するとアクセス順で要素を保持できる

HashMapクラス

宣言方法

まずはHashMapクラスを使用するためにインスタンスを生成する必要が有ります。

HashMapクラスの宣言は以下のように記述します。

Map<キーの型名, 値の型名> オブジェクト名 = new HashMap<>();

型推論により右辺のデータ型は省略出来ますので覚えておいてください。

なお値にはList/Set/Mapを持たせることができ、キーにはクラスを指定することも可能です。

Map<String, List> map = new HashMap<>();  // 値にListを指定
Map<String, Set> map = new HashMap<>();   // 値にSetを指定
Map<String, Map<Integer, Object>> map = new HashMap<>();  // 値にMapを指定
Map<Sample, List> map = new HashMap<>();  // キーにSampleというクラスを指定

メソッド

この項目では主要なメソッドを紹介します。

メソッド 使い方
Map.put(key, value) マップを追加する。
Map.get(key) マップを取得する。
Map.remove(key) マップを削除する。
Map.clear() マップの要素を全て削除する。
Map.containsKey(key) 指定したKeyが存在する場合はTrue、存在しない場合はfalseを返す。
Map.size() マップの長さを取得する。
Map.entrySet() KeyとValueをセットで取得する。
Map.keySet() Keyのみを取得する。
Map.values() Valueのみを取得する。

使い方

では実際のコードを見てみましょう。

値を追加する

Mapに値を追加するには、HashMapクラスで用意されているputメソッドを使用します。

putメソッドは第一引数にキーを指定し、第二引数にキーに関連付けられる値を指定します。

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

fruit.put("grape", "ぶどう");
fruit.put("apple", "りんご");
fruit.put("orange", "みかん");

またブロックを使って次のように記述することも出来ますが、この場合にはダイヤモンド演算子が使えず型引数を省略出来ません。

// new HashMap<>()とするとコンパイルエラーになるので注意!
Map<String, String> fruit = new HashMap<String, String>() {
	{
		put("grape", "ぶどう");
		put("apple", "りんご");
		put("orange", "みかん");
	}
};

なお既にキーがマッピングされている場合には上書きされ、マッピングが無い場合には”null”を返します。

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

fruit.put("grape", "ぶどう");
fruit.put("apple", "りんご");
fruit.put("apple", "みかん");

// この場合には"みかん"が出力される
System.out.println(fruit.get("apple"));

// マッピングの無いキーを参照すると"null"が返される
System.out.println(fruit.get("banana"));

値を取得する

Mapの値は、getメソッドを使用してMapのキーを指定することで取得できます。

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

public class Main {
	
	public static void main(String[] args) throws Exception {
		
		Map<String, String> fruit = new HashMap<String, String>() {
			{
				put("grape", "ぶどう");
				put("apple", "りんご");
				put("orange", "みかん");
			}
		};
		
		System.out.println(fruit.get("apple"));
		
	}
	
}

実行結果

りんご

キーを全て取得する

keySetメソッドを使用すると、Mapのキーを全て取得することが出来ます。

keySetメソッドはMapのキーをSet型で返すので、拡張for文を使って以下のように繰り返すことで全てのキーを取得できます。

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

public class Main {
	
	public static void main(String[] args) throws Exception {
		
		Map<String, String> fruit = new HashMap<String, String>() {
			{
				put("grape", "ぶどう");
				put("apple", "りんご");
				put("orange", "みかん");
			}
		};
		
		for (String key : fruit.keySet()) {
			System.out.println(key);
		}
		
	}
	
}

実行結果

orange
apple
grape

値を全て取得する

valuesメソッドを使用すると、Mapの値を全て取得することが出来ます。

valuesメソッドもMapのキーをSet型で返すので、拡張for文を使えばkeySetメソッドのように全ての値を取得できます。

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

public class Main {
	
	public static void main(String[] args) throws Exception {
		
		Map<String, String> fruit = new HashMap<String, String>() {
			{
				put("grape", "ぶどう");
				put("apple", "りんご");
				put("orange", "みかん");
			}
		};
		
		for (String val : fruit.values()) {
			System.out.println(val);
		}
		
	}
	
}

実行結果

みかん
りんご
ぶどう

キーと値をペアで全て取得する

Map.Entryインタフェースに実装されているentrySetメソッドを使用することで、キーと値をペアで取得できます。

Map.EntryはgetKeyメソッドでキーを、getValueメソッドで値を取得することができます。

entrySetメソッドはMap.EntryをSet型で返すので、拡張for文を使って以下のように繰り返すことで取得できます。

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

public class Main {
	
	public static void main(String[] args) throws Exception {
		
		Map<String, String> fruit = new HashMap<String, String>() {
			{
				put("grape", "ぶどう");
				put("apple", "りんご");
				put("orange", "みかん");
			}
		};
		
		for (Map.Entry<String, String> ent : fruit.entrySet()) {
			System.out.println(ent.getKey() + ":" + ent.getValue());
		}
		
	}
	
}

実行結果

orange:みかん
apple:りんご
grape:ぶどう

forEachを使った取得

MapインターフェースにはdefaultメソッドとしてforEachメソッドが定義されています。

次のように定義されているため、2つの引数を必要とします。

default void forEach (BiConsumer<? superK ,? super V> action)

forEachメソッドを使ったコードは以下の通りです。

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

public class Main {
	
	public static void main(String[] args) throws Exception {
		
		Map<String, String> fruit = new HashMap<String, String>() {
			{
				put("grape", "ぶどう");
				put("apple", "りんご");
				put("orange", "みかん");
			}
		};
		
		fruit.forEach((key, value) -> System.out.println(key + ":" + value));
		
	}
	
}

実行結果

orange:みかん
apple:りんご
grape:ぶどう

まとめ

今回はHashmapを使った連想配列の操作について解説しました。

連想配列の使用頻度はかなり高いので何度も繰り返し練習し必ずマスターするようにしましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。