【Java】HashMapクラスの使い方

# Map とは

`Map`とは、java.util.Map というインターフェイスで、Java でキーと値をセットにして扱いたい時に使うデータ構造です。
`Mapインターフェース`を用いることで、``HashMap``や``LinkedHashMap``といったデータ構造を統一的に取り扱えます。
本記事では HashMap クラスの使い方について書きます。

# Map インターフェースの使い方

Map インターフェースを実装するクラスを自作するか、``HashMap``や``LinkedHashMap``のような実装クラスを用います。
Map には同一のキーを複数登録出来ず、各キーは 1 つの値にしかマッピングできません。

# HashMap クラスの特徴

■ **キーの順序は保証されない**
■ **キーの重複は許容されていない**
■ **値の重複は可能**

# 宣言方法
HashMapクラスの宣言は以下のように記述します。
型推論により右辺のデータ型は省略出来ます
値には List、Set、Mapを持たせることができ、キーにはクラスを指定することも可能です。

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

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

# 使い方

### キーを指定して値を追加する(put メソッド)

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
	}
 }
```

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

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("dog", "猫");
		System.out.println(animal.get("dog")); //猫
		System.out.println(animal.get("pig")); //null
	}
 }
```

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

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
		System.out.println(animal.get("cat")); //猫
	}
 }
```

### キーと値をすべて取得する(keySet メソッド)

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

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");

		for (String pet : animal.keySet()) {
			System.out.println(pet);// monkey dog cat
		}
	}
 }
```

### 値をすべて取得する(values メソッド)

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

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");

		for (String pet : animal.values()) {
			System.out.println(pet);// 猿 犬 猫
		}
	}
 }
```

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

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");

		System.out.println(animal.size()); // 3
	}
 }
```

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

Map の中に特定のキーが含まれているかどうかは、containsKey メソッドを使って判断します。

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
		if (animal.containsKey("dog")) { // true
			System.out.println("犬が含まれています"); // 犬が含まれています
		}
	}
 }
```

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

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
		if (animal.containsValue("猿")) { // true
			System.out.println("monkeyが含まれています"); // monkeyが含まれています
		}
	}
 }
```

### 中身が空か真偽値を返す(isEmpty メソッド)

```java
public class Sample {
	public static void main(String[] args) {
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
		animal.clear();
		if (animal.isEmpty()) { // true
			System.out.println("空です"); // 空です
		}
	}
 }
```

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

```java
public class Sample {
    public static void main(String[] args) {
        Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
        animal.forEach((key,value) -> System.out.println(key + " " + value)));
        //monkey 猿　
        //dog 犬
        //cat 猫
    }
 }
```

#参照

[Java Platform SE 8 インタフェースMap](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html)