<目次>
(1) JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)
(1-1) Mapとは?
(1-2) Mapの種類や特徴
(1-2-1) 3つのMapに共通する点
(1-2-2) 3つのMapが異なる点
(1-2-3) Mapの使いどころ
(1-3) 各マップの概要&サンプルプログラム
(1-3-1) HashMap
(1-3-2) LinkedHashMap
(1-3-3) TreeMap
(1) JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)
(1-1) Mapとは?
JavaにおけるMapは「java.util」パッケージの「Mapインターフェイス」として利用できます。
(1-2) Mapの種類や特徴
主なMapの種類としては「HashMap」や「LinkedHashMap」や「TreeMap」があり、それぞれのMapインターフェイスとの関係は下図の通りです。
(図111)
(1-2-1) 3つのMapに共通する点
・「キー」と「値」のペアを保持する点
・要素を繰り返し処理で「ループ」する事が可能
・全て「java.util.Map」インターフェイスを実装している
(1-2-2) 3つのMapが異なる点
各Map(Mapを実装したクラス)の主な特徴は下表の通りです。
特徴 | HashMap | LinkedHashMap | TreeMap |
nullキーの許容 | ○(OK) ⇒但し1つのみ |
○(OK) ⇒但し1つのみ |
×(NG) |
null値の許容 | ○(OK) ⇒複数可 |
○(OK) ⇒複数可 |
○(OK) |
キーの重複 | ×(NG) | ×(NG) | ×(NG) |
順番の保証(ソート有無) | ×(NG) | ○(OK) ⇒追加した順序 |
○(OK) ⇒昇順ソート |
(1-2-3) Mapの使いどころ
上記の表の通り、Mapは「キー」の値をベースに「値」を取り出す事が出来るため、「格納した値を後で取り出す」必要がある時にはMapが便利です。そのような性質から、どの種類のMapも重複したキーを許容しないようになっています。
(1-3) 各マップの概要&サンプルプログラム
各Classについて、挙動のイメージを掴むための簡単なサンプルプログラムをご紹介いたします。
(1-3-1) HashMap
HashMapは最もマップの中では最もシンプルで、Hash(ハッシュ)というのはMapの構造を実現するために使われている技術です。具体的にはStringといったデータから一定のルールに従って計算された値を「ハッシュ値」と呼び、ハッシュというと「ハッシュ値」あるいは「ハッシュの計算に使った関数」を指します。
int result = (int)hashmap.get(“quantity”)
(サンプルプログラム)
package studyc; import java.util.HashMap; import java.util.Map; public class HashMapTest { public static void main(String args[]) { Map<String, Object> hashmap = new HashMap<>(); //キーと値のセットを定義 hashmap.put("name", "apple"); hashmap.put("quantity", 10); hashmap.put("origin", "Aomori"); //キーと値のセットを定義(nullキー) hashmap.put(null, "banana"); //キーと値のセットを定義(null値) hashmap.put("name", null); //各要素をループして表示 for(Map.Entry<String, Object> hm : hashmap.entrySet()) { System.out.printf("Key=|%-10s| Value=|%-15s| \n",hm.getKey(),hm.getValue()); } } }
(図131)
(1-3-2) LinkedHashMap
LinkedHashMapはHashMapと基本的な性質は似ていますが、先程と大きく異なるのは順番が保証されている点です。特にLinkedHashMapは要素を追加した順番に出力されます。
下記のサンプルですとname⇒quantity⇒origin⇒nullのキーの順番で追加しており、最後にnameの値をbananaに上書きしているので、上書きされた値で出力されます。
サンプルは一応全体を載せていますが、HashMapと異なるのはnewする対象が「HashMap」⇒「LinkedHashMap」に変わっただけで、後の部分は同じです。
(サンプルプログラム)
import java.util.LinkedHashMap; import java.util.Map; public class IT0985_LinkedHashMapTest { public static void main(String args[]) { Map<String, Object> hashmap = new LinkedHashMap<>(); //キーと値のセットを定義 hashmap.put("name", "apple"); hashmap.put("quantity", 10); hashmap.put("origin", "Aomori"); //キーと値のセットを定義(nullキー) hashmap.put(null, "banana"); //キーと値のセットを定義(null値) hashmap.put("name", null); //各要素をループして表示 for(Map.Entry<String, Object> hm : hashmap.entrySet()) { System.out.printf("Key=|%-10s| Value=|%-15s| \n",hm.getKey(),hm.getValue()); } } }
(図132)
(1-3-3) TreeMap
最後にTreeMapをご紹介します。こちらは先程の2つとは若干異なりnullキーを許容しないため、nullキーを入れようとすると例外が発生します。