Java 入門

ホーム > コレクション > キー・バリューペアを保持する Map の基礎- HashMap

キー・バリューペアを保持する Map の基礎- HashMap

データのコレクションを保持して、それを取り出すときに順番に取り出す場合の他、何かのキーを元にデータを取得する場合もよくあることです。

例えば、電話番号をキーにして個人を特定する、ということは実生活では普通にあることですよね。

Map インターフェイスはそうした、ある値に対して、ある値を引いてくる(取得する)という場合に使います。

Mapを実装したクラス

Mapインターフェイスを実装したクラスとして代表的なのは、HashtableHashMapTreeMap が挙げられます。

HashtableHashMap はほぼ同様で、ハッシュテーブルとして実装されています。HashMapは null のキーを許容する点で Hashtableと異なります。 どちらもその中で保持される順序は保証されていません。一方、TreeMap はキーの昇順 (ascending order) で保存されます。

あるキーに対してそれに対する値を get, set するのに、HashMapHashTableO(1) で、TreeMapO(log(n))の速度でデータを保存、取得できます。

つまり、MashMapHashtable では、保存するデータ数が増えてもいつも同じような速度で保存、取得ができますが、 TreeMap ではデータ数が 100倍になると 1 個の時と比べて 2倍程度の時間が、データ数が 1,000倍になると 3 倍程度の時間がかかる、という程度だということです。

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;
import java.util.Set;

public class MapTest1 {

  public static void main(String[] args){
    
    Map<String, Person> 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 を利用するなどすると良いです。

ホーム > コレクション > キー・バリューペアを保持する Map の基礎- HashMap