Mapインターフェース
コレクションフレームワークに属するMapインターフェースはListインターフェースと違い、0から始まるインデックスではなくキーとバリューを一対にして要素を管理します。mapインスタンスの宣言はジェネリックの< >の中にキーとバリューの型をカンマ区切りで指定し、要素の登録はputメソッド、取り出しはgetメソッドで行います。
要素の登録では同じキーの複数登録はできませんが、キーが違えば同じバリューの複数登録は可能です。
要素を連続して取り出すには、keySetメソッドでキーの一覧をSetオブジェクトに取り出し、Setオブジェクトから拡張for文でキーを順次取り出しながら、getメソッドでバリューを取出します。下記HashMapを使ったサンプルの15行目から18行目及び21行目から24行目を参照)
Mapインターフェースの実装の一つがHashMapです。
HashMapはハッシュを使って、要素の保存場所を決定するので、要素の追加・削除・変更という操作が、要素の数に関わらず一定の時間で実行可能です。
import java.util.Map; import java.util.Set; import java.util.HashMap; public class HashMapSample { public static void main(String[] args) { Map<Integer, String> map=new HashMap<>( ); System.out.println(map.size()); System.out.println("---------------"); map.put(1, "Bach"); map.put(10, "Chopin"); map.put(100, "Anonymous"); Set<Integer> keys = map.keySet(); for(int key: keys) { System.out.println("key:" + key + " value:" + map.get(key)); } System.out.println("---------------"); map.put(101, "Anonymous"); keys = map.keySet(); for(int key: keys) { System.out.println("key:" + key + " value:" + map.get(key)); } System.out.println("---------------"); System.out.println("Map contains key:10 (\"Chopin\"):" + map.containsKey(10)); map.remove(100, "Anonymous"); System.out.println(map.size()); System.out.println(map); } }
実行結果
>java HashMapSample
0
—————
key:1 value:Bach
key:100 value:Anonymous
key:10 value:Chopin
—————
key:1 value:Bach
key:100 value:Anonymous
key:101 value:Anonymous
key:10 value:Chopin
—————
Map contains key:10 (“Chopin”):true
3
{1=Bach, 101=Anonymous, 10=Chopin}
>
また、別の実装としてTreeMapクラスがあります。
基本的な仕様はHashMapと変わりませんが、要素を辞書順にソートして管理します。
実行結果の最後のmap内の要素の呼び出し結果をHashMapのそれと比較してください。
import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapSample { public static void main(String[] args) { Map<Integer, String> map=new TreeMap<>( ); System.out.println(map.size()); System.out.println("---------------"); map.put(1, "Bach"); map.put(10, "Chopin"); map.put(100, "Anonymous"); Set<Integer> keys = map.keySet(); for(int key: keys) { System.out.println("key:" + key + " value:" + map.get(key)); } System.out.println("---------------"); map.put(101, "Anonymous"); keys = map.keySet(); for(int key: keys) { System.out.println("key:" + key + " value:" + map.get(key)); } System.out.println("---------------"); System.out.println("Map contains key:10 (\"Chopin\"):" + map.containsKey(10)); map.remove(100, "Anonymous"); System.out.println(map.size()); System.out.println(map); } }
実行結果
>java TreeMapSample
0
—————
key:1 value:Bach
key:10 value:Chopin
key:100 value:Anonymous
—————
key:1 value:Bach
key:10 value:Chopin
key:100 value:Anonymous
key:101 value:Anonymous
—————
Map contains key:10 (“Chopin”):true
3
{1=Bach, 10=Chopin, 101=Anonymous}
>