【HashMap】Javaで連想配列を扱う!サンプルつき

hashmap
  • このエントリーをはてなブックマークに追加
  • Pocket

Javaでも実は連想配列を使うことができる。

連想配列とは、要素番号ではなくて、言葉同士で配列を取り出したり操作したりするものだ。詳しくは後でお伝えする。

そのために使うのがHashMapだ。このページでは、JavaのHashMapについてご紹介していく。理解しておくと、必ず役に立つ機会があるはずだ。

HashMapによる連想配列

連想配列とは?

Javaの配列では、値の取得はインデックス番号で行ってきた。要するに、配列名[数字]で取り出す意味だ。

データベースのように名前で検索して、値を格納したり、取り出したりできない。例えば、「orange」というキーワードで「みかん」という値を取り出すなどができない。

このように言葉同士でキーと値が繋がった配列を連想配列という。例えば、次の配列では、"one"と"10"、"two"と"20"などが繋がっている。

連想配列

配列で、"one"を指定すると"10"が取り出せるようになっているわけだ。

連想配列が使えると、フォームから送られたデータの扱いなど様々な場面で便利に使える。

HashMap

Javaで連想配列を使うときは、「HashMap」を使う。

HashMapを使うとキーに紐付けされて、HashMapに格納された値にアクセスできるようになる。

HashMapに格納する値は、キーが異なれば同じ値であってもかまわない。しかし、キーが同じ場合は、最後に格納された値で前の値が上書きされる。

JavaでのHashMapを使うための書き方の詳細を確認していこう。

HashMapクラスを使うための準備をする

まず、mapにアクセスするために、コンストラクタを使ってその入れ物となるHashMapクラスのオブジェクトを生成しなければならない。

そのコンストラクタの書き方の詳細を見てみよう。サンプルコードも後半に置いてあるので先にそちらを確認したければスクールして下に行ってほしい。

HashMap()

内容

容量が16でload factor(0.75)の空のHashMapを生成する。

※ load factor(0.75)とは、3/4埋まったら容量を2倍にするということ

HashMap(int initalCapacity)

内容

指定された容量でload factor(0.75)の初期値を持った空のHashMapを生成する。

引数:initialCapacity - 初期容量

例外:IllegalArgumentException - もし指定されたinitialCapacity がマイナスであるならば

値を追加して取得するメソッド

mapにキーと値を追加しなければ、何も始まらない。次に、追加された値を取り出す。これが基本的なメソッドだ。それらのメソッドの詳細を見てみよう。

追加

追加するためのメソッドと置換するメソッドはひとつだ。キーがなければ、追加されるし。そでに存在すれば、前の値が置換される。

put(K key, V value)

戻り値の型

public V

内容

指定されたキーと指定された値をmapの中で関連させる、もし、既にmapが指定されたキーのための関連を持っていたならば、古い値は置き換えられる。

 

引数:

key - 指定された値と関連させるべきキー

value - キーと関連させるべき値

 

戻り値:キーと関連ある前の値。または、もしキーと関連がないならば、null。(戻り値nullは、前の関連がキーとnullであったことも示すことができる)

値の取得

キーを指定して、mapされた値を取得する。もしmapが見つからなければ、戻り値nullで教えてくれる。

get(Object key)

戻り値の型

public V

内容

指定されたキーが関連付けられている値を返す。または、もしmapがキーの関連を含んでいないならば、nullを戻す。

形式的に言えば、もしmapがキーkから値vへ(key==null ? k==null : key.equals(k))のような関連を含んでいたら、このメソッドはvを戻す。そうでなければ、nullを戻す。(そのような関係は、ひとつしかありえない)

戻り値nullは、mapがキーの関連を持っていないことを必ずしも示していない。つまり、mapがはっきりとkeyにnullを関連させている可能性がある。

 

引数:key - 戻すべき値と関連付けられたキー

戻り値:指定されたキーに関連付けられた値。もしこのmapがキー対する関連付けを含んでいないなら、null。

サンプルプログラム

それでは実際にサンプルプログラムで確認してみよう。これを見るとわかりやすいはずだ。

import java.util.HashMap;

public class HashMapAddition {
    public static void main(String[] args) {
        HashMap<String, String> hashmap = new HashMap<String, String>();//[1]
        hashmap.put("apple", "りんご");//[2]
        hashmap.put("orange", "みかん");//[3]
        hashmap.put("peach", "もも");//[4]
        System.out.println("[5] 値[0]:" + hashmap.get("apple"));
        System.out.println("[6] 値[1]:" + hashmap.get("orange"));
        System.out.println("[7] 値[2]:" + hashmap.get("peach"));
        System.out.println("[8] 値[3]:" + hashmap.get("mango"));
    }
} 

実行結果

[5] 値[0]:りんご
[6] 値[1]:みかん
[7] 値[2]:もも
[8] 値[3]:null

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

このプログラムは、くだものの名前を3組のキー:英文と値:日本文の関連で追加する。次に、値を取得して表示している。このとき、存在しないキーを設定して、nullが表示されるかを確認している。

  • [1] HashMapクラスのオブジェクト、mapを生成する。
  • [2] mapにキー:「apple」値:「りんご」を追加する。
  • [3] mapにキー:「orange」値:「みかん」を追加する。
  • [4] mapにキー:「peach」値:「もも」を追加する。
  • [5] mapからキー:「apple」で取得した値を表示する。
  • [6] mapからキー:「orange」で取得した値を表示する。
  • [7] mapからキー:「peach」で取得した値を表示する。
  • [8] mapからキー:「mango」で取得した値を表示する。

キーにmapした値を置換削除するメソッド

前のセクションではputメソッドによりキーと値を追加した。そのキーを使って値を変更することも、値を削除することもできる。その詳細を見てみよう。

置換

前のセクションの「追加」で説明したputメソッドを参照。

削除

キーを指定して、値を削除する。戻り値に削除された値が返されるので、確実に期待する値が削除されたかどうかが分かる。

remove(Object key)

戻り値の型

public V

内容

もし存在するならば、mapから指定されたキーの関連付けを削除する。

 

引数:key – mapから削除されるべき関連付けのキー

戻り値:キーに関連付けられた前の値。または、もしキーの関連付けがないならば、null。(戻り値nullは、mapが前にキーとnullを関連付けていたことも意味している)

値を検索して置換削除するサンプルプログラム

それでは実際にサンプルプログラムで確認してみよう。

import java.util.HashMap;

public class HashMapChangeAndRemove {
    public static void main(String[] args) {
        HashMap<String, String> hashmap = new HashMap<String, String>();//[1]
        hashmap.put("apple", "りんご");//[2]
        hashmap.put("orange", "みかん");//[3]
        hashmap.put("peach", "もも");//[4]
        System.out.println("[5] [キー:apple]:" + hashmap.get("apple"));
        System.out.println("[6] [キー:orange]:" + hashmap.get("orange"));
        System.out.println("[7] [キー:peach]:" + hashmap.get("peach"));
        String previousValue =  hashmap.put("apple", "リンゴ"); //[8]
        System.out.println("[9] 置換された[キー:apple]:" + previousValue);
        String removedValue = hashmap.remove("peach"); //[10]
        System.out.println("[11] 削除された[キー:peach]:" + removedValue);

        System.out.println("[12] [キー:apple]:" + hashmap.get("apple"));
        System.out.println("[13] [キー:orange]:" + hashmap.get("orange"));
        System.out.println("[14] [キー:peach]:" + hashmap.get("peach"));    }
}

実行結果

[5] [キー:apple]:りんご
[6] [キー:orange]:みかん
[7] [キー:peach]:もも
[9] 置換された[キー:apple]:りんご
[11] 削除された[キー:peach]:もも
[12] [キー:apple]:リンゴ
[13] [キー:orange]:みかん
[14] [キー:peach]:null

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

このプログラムは、くだものの名前を最初に3つ追加した後、追加した値の「りんご」を「リンゴ」に置換する。「もも」を削除する。次に、置換した値を表示して置換を確認している。削除した値は取得して、戻り値がnullであることを確認している。

  • [1] HashMapクラスのオブジェクト、mapを生成する。
  • [2] mapにキー:「apple」値:「りんご」を追加する。
  • [3] mapにキー:「orage」値:「みかん」を追加する。
  • [4] mapにキー:「peach」値:「もも」を追加する。
  • [5] mapのキー: appleにmapされた値を表示する。
  • [6] mapのキー: orangeにmapされた値を表示する。
  • [7] mapのキー: peachにmapされた値を表示する。
  • [8] mapのキー: appleを文字列:「リンゴ」で置換する。
  • [9] 置換前の値を表示する。
  • [10] mapのキー: peachを削除する。
  • [11] 削除した値を表示する。
  • [12] mapのキー: appleにmapされた値を表示する。
  • [13] mapのキー: orangeにmapされた値を表示する。
  • [14] mapのキー: peachにmapされた値を表示する。

値すべてに対して繰り返し処理(forEach)

値をリストからひとつひとつ取り出して、何かの処理をすることはよくある。その基本からラムダ式まで詳細を見てみよう。

forEach(BiConsumer<? super K,? super V> action)

戻り値の型

public void

内容

すべてのentryが処理されるか、actionが例外を発生させるまで、各々のentryのためのactionが実行される。実装されたクラスによって特定されない限り、entry set繰り返しの順序でactionが実行される(繰り返しの並びが特定されるならば)。actionより投げられた例外は、呼び出し元に中継される。

 

引数:action – 各々の値のために実行されるべきaction。

keySet()

戻り値の型

public Set<K>

内容

このmapに含まれるキーのSet viewを戻す。それは、mapと連動しているので、mapへの変更はsetへ反映される。逆も同様です。

もしsetの繰り返し処理が進行中にmapが修正されたなら(iterator自身の削除操作は例外)、繰り返し処理の結果は定義されていない。setは要素の削除をサポートしている。それはmapから対応するmappingをIterator.remove,、Collection.remove、 removeAll,、retainAll、 とclear操作を経由で削除する。addやaddAll操作はサポートされていない。

 

戻り値:このmapに含まれるkeysのviewを返す。

values()

戻り値の型

public Collection<V>

内容

このmapに含まれる値のCollection viewを戻す。それは、mapと連動しているので、mapへの変更はcollectionへ反映される。逆も同様です。

もしcollectionの繰り返し処理が進行中にmapが修正されたなら(iterator自身の削除操作は例外)、繰り返し処理の結果は定義されていない。collectionは要素の削除をサポートしている。それはmapから対応する関連付けをIterator.remove,、Collection.remove、 removeAll,、retainAll、 とclear操作を経由で削除する。addやaddAll操作はサポートされていません。

 

戻り値:このmapに含まれるvaluesのviewを返す。

entrySet()

戻り値の型

public Set<Map.Entry<K,V>>

内容

このmapに含まれる関連付けのSet viewを戻す。それは、mapと連動しているので、mapへの変更はsetへ反映される。逆も同様です。

もしsetの繰り返し処理が進行中にmapが修正されたなら(iterator自身の削除操作、またはiteratorによって戻されたmap entryのsetValue操作は例外)、繰り返し処理の結果は定義されていない。setは要素の削除をサポートしている。それはmapから対応する関連付けをIterator.remove,、Collection.remove、 removeAll,、retainAll、 とclear操作を経由で削除する。addやaddAll操作はサポートされていません。

 

戻り値:このmapに含まれる関連付けのviewを返す。

whileを使ったサンプルプログラム

それでは実際にサンプルプログラムで確認してみよう。

import java.util.*;

public class HashMapFor {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<String, String>();//[1]
        map.put("apple", "りんご");//[2]
        map.put("orange", "みかん");//[3]
        map.put("peach", "もも");//[4]
        Set<String> keySet = map.keySet();//[5]
        Iterator<String> iteratorForKey = keySet.iterator();//[6]
        while(iteratorForKey.hasNext()) {//[7]
            String key = iteratorForKey.next();//[8]
            System.out.println("[9]キー:" + key);
        }
        Collection<String> values = map.values();//[10]
        Iterator<String> iteratorForValues = values.iterator();//[11]
        while(iteratorForValues.hasNext()) {//[12]
            String value = iteratorForValues.next();//[13]
            System.out.println("[14]値:" + value);
        }
        Set<Map.Entry<String, String>> entrySet = map.entrySet();//[15]
        Iterator<Map.Entry<String, String>> iteratorForMap = entrySet.iterator();//[16]
        while(iteratorForMap.hasNext()) {//[17]
            Map.Entry<String, String> entry = iteratorForMap.next();//[18]
            System.out.println("[19]キー:" + entry.getKey() + " 値:" + entry.getValue());
        }
    }
} 

実行結果

どのサンプルプログラムも実行結果は同じになる。

[8]キー:orange
[8]キー:apple
[8]キー:peach
[12]値:みかん
[12]値:りんご
[12]値:もも
[16]キー:orange 値:みかん
[16]キー:apple 値:りんご
[16]キー:peach 値:もも

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

このプログラムは、くだものの名前を3つ追加した後、forを使用してmapの値をすべて表示している。

  • [1] HashMapクラスのオブジェクト、mapを生成する。
  • [2] mapにキー:「apple」値:「りんご」を追加する。
  • [3] mapにキー:「orage」値:「みかん」を追加する。
  • [4] mapにキー:「peach」値:「もも」を追加する。
  • [5] [6] mapのキーのIteratorを取得する。
  • [7] [8] Iteratorを使用して、すべてのキーをひとつずつ取得する。
  • [9] キーを表示する。
  • [10] [11] mapの値のIteratorを取得する。
  • [12] [13] Iteratorを使用して、すべての値をひとつずつ取得する。
  • [14] 値を表示する。
  • [15] [16] mapのキーと値のIteratorを取得する。
  • [17] [18] Iteratorを使用して、すべてのキーと値をひとつずつ取得する。
  • [19] キーと値を表示する。

拡張forを使ったサンプルプログラム

このプログラムが拡張forを使ったサンプルプログラムだ。値を表示するところだけがforと違う。

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

public class HashMapEnhancedFor {
    public static void main(String[] args) {
        HashMap<String, String> hashmap = new HashMap<String, String>();//[1]
        hashmap.put("apple", "りんご");//[2]
        hashmap.put("orange", "みかん");//[3]
        hashmap.put("peach", "もも");//[4]
        for(String key : hashmap.keySet()) {//[5]
            System.out.println("[6]キー:" + key);
        }
        for(String value : hashmap.values()) {//[7]
            System.out.println("[8]値:" + value);
        }
        for(Map.Entry<String, String> entry : hashmap.entrySet()) {//[9]
            System.out.println("[10]キー:" + entry.getKey() + " 値:" + entry.getValue());//[10]
        }
    }
}

実行結果

[6]キー:orange
[6]キー:apple
[6]キー:peach
[8]値:みかん
[8]値:りんご
[8]値:もも
[10]キー:orange 値:みかん
[10]キー:apple 値:りんご
[10]キー:peach 値:ももん

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

このプログラムは、くだものの名前を3つ追加した後、forを使用してmapの値をすべて表示している。

  • [1] HashMapクラスのオブジェクト、mapを生成する。
  • [2] mapにキー:「apple」値:「りんご」を追加する。
  • [3] mapにキー:「orage」値:「みかん」を追加する。
  • [4] mapにキー:「peach」値:「もも」を追加する。
  • [5][6] 拡張forを使用して、mapのキーをすべて表示する。
  • [7][8] 拡張forを使用して、mapの値をすべて表示する。
  • [9][10] 拡張forを使用して、mapのキーと値をすべて表示する。

forEachを使ったサンプルプログラム

このプログラムがforEachを使ったサンプルプログラムだ。値を表示するところだけがforと違う。

import java.util.HashMap;

public class HashMapForEach {
    public static void main(String[] args) {
        HashMap<String, String> hashmap = new HashMap<String, String>();//[1]
        hashmap.put("apple", "りんご");//[2]
        hashmap.put("orange", "みかん");//[3]
        hashmap.put("peach", "もも");//[4]
        hashmap.forEach((key, value) -> System.out.println("[5]キー:" + key));
        hashmap.forEach((key, value) -> System.out.println("[6]値:" + value));
        hashmap.forEach((key, value) -> System.out.println("[7]キー:" + key + " 値:" + value));
    }
}

実行結果

[5]キー:orange
[5]キー:apple
[5]キー:peach
[6]値:みかん
[6]値:りんご
[6]値:もも
[7]キー:orange 値:みかん
[7]キー:apple 値:りんご
[7]キー:peach 値:もも

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

このプログラムは、くだものの名前を3つ追加した後、forを使用してmapの値をすべて表示している。

  • [1] HashMapクラスのオブジェクト、mapを生成する。
  • [2] mapにキー:「apple」値:「りんご」を追加する。
  • [3] mapにキー:「orage」値:「みかん」を追加する。
  • [4] mapにキー:「peach」値:「もも」を追加する。
  • [5] ラムダ式を使用して、mapのキーをすべて表示する。
  • [6] ラムダ式を使用して、mapの値をすべて表示する。
  • [7] ラムダ式を使用して、mapのキーと値をすべて表示する。

まとめ

このページではHashMapについてお伝えした。

連想配列として、キーとバリューをつなげたいときには便利に使えるクラスだ。サンプルプログラムも確認して、使えるようになっておこう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できます。

IT講師に興味はありませんか?

・「今までIT講師をやってきたが、更に多くの講義を行いたい」

・「エンジニアとしてやってきたが講師業に魅力を感じている」

・「講師として活躍するためにベースとなる知識を知りたい」

・「様々な分野や言語の講師にチャレンジしてみたい」


という方はぜひIT講師募集のページをご覧ください。


リスキルテクノロジーでは「受講している方々にITを好きになってもらう」ことを目標に、同じ目標に向かって歩んで行ける講師の方を常に探しています。


システム開発やインフラ構築などのエンジニアリング経験を活かし、新入社員などの未経験者や経験の浅い初学者の方々に対してITトレーニングを行っていただくことになります。


テキストやカリキュラムは事前に用意されており、それらを元に講義を進めていくため、IT講師をはじめて実施する方でも安心してトレーニングを実施できます。


IT講師募集のページを見る

SNSでもご購読できます。

コメント

コメントを残す

*

未経験からの育成制度も充実
IT講師に興味はありませんか?

リスキルテクノロジーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する