Java の Map インターフェイスと HashMap
Java の Map インターフェイスとは
Map インターフェイスは、いわゆる「キー・バリューペア」と呼ばれるデータ構造を作るのに使います。
例えば、ユーザー ID からユーザーアカウントを特定する、というような場合は、ユーザーID をキーにしてバリュー(値)としてユーザーアカウント情報を取得するということになります。
Map インターフェイスを実装した Java クラス
Mapインターフェイスを実装した Java の標準クラスとして代表的なのは、Hashtable、HashMap と TreeMap が挙げられます。
Hashtable と HashMap はほぼ同様で、ハッシュテーブルとして実装されています。HashMapは null のキーを許容する点で Hashtableと異なります。 どちらもその中で保持される順序は保証されていません。一方、TreeMap はキーの昇順 (ascending order) で保存されます。
あるキーに対してそれに対する値を get, set するのに、HashMap と HashTable は O(1) で、TreeMap は O(log(n))の速度でデータを保存、取得できます。
つまり、MashMap や Hashtable では、保存するデータ数が増えてもいつも同じような速度で保存、取得ができますが、 TreeMap ではデータ数が 100倍になると 1 個の時と比べて 2倍程度の時間が、データ数が 1,000倍になると 3 倍程度の時間がかかる、という程度だということです。
Java の HashMap を利用する具体例
それでは、実際に Map クラスを利用してみましょう。ここでは HashMap を取り上げます。
電話番号からユーザー情報を引いてくる、という例を考えます。ここで使う Person クラスのコードは次の通りです。
class Person {
String name;
int age;
String city;
public Person(String name, int age, String city){
this.name = name;
this.age = age;
this.city = city;
}
public void show(){
System.out.format("%s (%d) - %s\n", name, age, city);
}
}
さて、HashMap を利用するサンプルコードとして次を考えます。パッケージ 名については適当に直してください。
package com.keicode.java.test;
import java.util.HashMap;
import java.util.Map;
public class MapTest1 {
public static void main(String[] args) {
Map people = new HashMap<String, Person>();
people.put("123-456-7890", new Person("Keith", 31, "Torrance"));
people.put("987-654-3210", new Person("Ichiro", 37, "Seattle"));
people.put("345-678-9012", new Person("Hideki", 32, "Oakland"));
for (Map.Entry<String, Person> entry : people.entrySet()) {
Person p = entry.getValue();
p.show();
}
}
}
ここでは HashMap を作成して、それに対して電話番号の文字列 (String) をキーにして、 Person のインスタンスを保存しています。保存には put メソッドを利用します。
それから、その中身を for ループでエントリを一個ずつ取り出して、それぞれの show メソッドを呼び出しています。
その結果、次のように出力されました。
Ichiro (37) - Seattle
Keith (31) - Torrance
Hideki (32) - Oakland
キーのコレクションを先に取得したい場合は、次のように keySet が使えます。
Set<String> keys = people.keySet();
for(String key : keys){
Person p = people.get(key);
p.show();
}
プログラミングの初心者の人は、コレクションというとリストばかり使う人がいるかもしれませんが、キーに対する値を取得するような状況では上に述べたように主に速度の問題がありますので、 Map を利用するなどすると良いです。