Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

Map

このページではコレクション・フレームワークの内、Mapインタフェースについて説明します。

Mapの概要

Mapインタフェースはキーと値が対になった要素を持ちます。キーの重複は許可されず各キーは1つの値のみに対応付けられます。キーから値を参照するデータ構造を持ったデータの利用に適しています。Mapインタフェースを実装するクラスとして、HashMap、TreeMap、LinkedHashMapが定義されています。

HashMapクラス

Mapインタフェースを実装した基本となるクラスです。キーの並び順を保持しないという特性をもっています。Mapインタフェースを実装したクラス内では最も高速に動作します。

HashMapクラスはHashTableクラスの後継として定義されたものです。違いは要素の操作を行う際、HashTableクラスが同期化されているのに対して、HashMapクラスが同期化されていない点です。HashMapクラスは同期化されていない分、高速に動作します。同期化された処理をHashMapクラスで行う場合は、HashMapクラスに同期処理を実装します。

TreeMapクラス
キーが自然順序、もしくはコンストラクタに指定されたComparatorに従って昇順にソートされた要素を持ちます。
LinkedHashMapクラス
キーが挿入される挿入順を保持します。コンストラクタの引数の指定により、挿入順ではなくアクセス順を保持することもできます。デフォルトの状態では挿入順です。

【例1】HashMap、TreeMap、LinkedHashMapがそれぞれどのような特性を持っているのかを例示します。

import java.util.*;

public class ExCollection7 {
    public static void main(String[] args) {
        ExCollection7 exClass = new ExCollection7();
        exClass.showFeature(new HashMap(), "HashMap");  //(1)
        exClass.showFeature(new TreeMap(), "TreeMap");  //(2)
        exClass.showFeature(new LinkedHashMap(), "LinkedHashMap");  //(3)
    }

    void showFeature(Map exMap, String s) {
        String[] tel = {"092", "06", "052", "03", "011"};  //(4)
        String[] area = {"Fukuoka", "Osaka", "Nagoya", "Tokyo", "Hokkaido"}; //(5)
        for (int i = 0; i < 5; i++) {
            exMap.put(tel[i], area[i]);  //(6)Mapに要素を追加
        }
        System.out.println(s + " = " + exMap);  //(7)各Mapの要素を表示
    }
}

解説1

  1. (1)引数にHashMapオブジェクトと、キーワード”HashMap”を引数に取り、メソッドshowFeatureを呼び出します。
  2. (2)引数にTreeMapオブジェクトと、キーワード”TreeMap”を引数に取り、メソッドshowFeatureを呼び出します。
  3. (3)引数にLinkedHashMapオブジェクトと、キーワード”LinkedHashMap”を引数に取り、メソッドshowFeatureを呼び出します。
  4. (4)Mapのキーとなる配列telを生成します。
  5. (5)Mapの値となる配列areaを生成します。
  6. (6)forループで配列tel、配列areaの要素を順番にMapに追加します。
  7. (7)HashMapクラス、TreeMapクラス、LinkedHashMapクラス、それぞれの特性を持ったMapの要素を表示します。

実行結果1

D:\JAVA>javac ExCollection7.java

D:\JAVA>java ExCollection7
# HashMapの特性はキーの順序を保持しないことです。キー追加順{"092", "06", "052", "03", "011"}に対して、ランダムに表示されます。
HashMap = {03=Tokyo, 011=Hokkaido, 052=Nagoya, 06=Osaka, 092=Fukuoka}

# TreeMapの特性はキーを昇順にソートすることです。キー追加順{"092", "06", "052", "03", "011"}に対して、昇順にソートされています。
TreeMap = {011=Hokkaido, 03=Tokyo, 052=Nagoya, 06=Osaka, 092=Fukuoka}

# LinkedHasMapの特性は要素の挿入順を維持することです。キー追加順{"092", "06", "052", "03", "011"}に対して、追加順を維持しています。
LinkedHashMap = {092=Fukuoka, 06=Osaka, 052=Nagoya, 03=Tokyo, 011=Hokkaido}

D:\JAVA>

Mapのコンストラクタ

HashMapクラスのコンストラクタ

コンストラクタ 説明
HashMap( ) 初期容量(16)、負荷係数(0.75)の空のHashMapを作成します。
HashMap(Map) 引数に指定されたMapの要素を保持したHashMapを作成します。
HashMap(int) 引数に指定した容量の空のHashMapを作成します。
HashMap(int, float) 引数に指定した容量と負荷係数を持つ、空のHashMapを作成します。

※ HashMapはハッシュテーブルのキー項目数が容量と負荷係数をかけた値を上回った場合に、容量を約2倍に増やします。負荷係数のデフォルト値0.75は、多くの場合において適切な値であり、それほど変更を検討する値ではないとAPIリファレンスに記載されています。

TreeMapクラスのコンストラクタ

コンストラクタ 説明
TreeMap( ) 要素の自然順序付けに従ってソートされた、空のTreeMapを作成します。
TreeMap(Map) 引数に指定されたMapの要素を持ち、要素の自然順序付けに従ってソートされたTreeMapを作成します。
TreeMap(Comparator) 引数に指定されたComparatorに従ってソートされた、空のTreeMapを作成します。
TreeMap(SortedMap) 引数に指定されたSortedMapと同じ要素、同じ順序付けをもつ、新しいTreeMapを作成します。

LinkedHashSetクラスのコンストラクタ

コンストラクタ 説明
LinkedHashMap( ) 初期容量(16)、負荷係数(0.75)の空の挿入順LinkedHashMapを作成します。
LinkedHashMap(Map) 引数に指定されたMapの要素を保持した挿入順LinkedHashMapを作成します。
LinkedHashMap(int) 引数に指定した容量の空の挿入順LinkedHashMapを作成します。
LinkedHashMap(int, float) 引数に指定した容量と負荷係数を持つ、空の挿入順LinkedHashMapを作成します。
LinkedHashMap(int, float, boolean) 引数に指定した容量と負荷係数を持ち、第3引数がtrueの場合はアクセス順、falseの場合は挿入順の空のLinkedHashMapを作成します。

【例2】要素の挿入順を保持するLinkedHashMapオブジェクトと、要素のアクセス順を保持するLinkedHashMapオブジェクトを生成した例です。

import java.util.*;

public class ExCollection8 {
    public static void main(String[] args) {
        String[] tel = {"092", "06", "052", "03", "011"};  //(1)
        String[] area = {"Fukuoka", "Osaka", "Nagoya", "Tokyo", "Hokkaido"};  //(2)

        Map lhm1 = new LinkedHashMap(16, 0.75F, true);  //(3)アクセス順を生成
        Map lhm2 = new LinkedHashMap(16, 0.75F, false);  //(4)挿入順を生成

        //(5)要素を挿入
        for (int i = 0; i < 5; i++) {
            lhm1.put(tel[i], area[i]);
            lhm2.put(tel[i], area[i]);
        }

        //(6)要素にアクセス
        lhm1.get("011"); lhm2.get("011");
        lhm1.get("03"); lhm2.get("03");
        lhm1.get("052"); lhm2.get("052");
        lhm1.get("06"); lhm2.get("06");
        lhm1.get("092"); lhm2.get("092");

        System.out.println("アクセス順 = " + lhm1);  //(7)アクセス順の要素を表示
        System.out.println("挿入順 = " + lhm2);  //(8)挿入順の要素を表示
    }
}

解説2

  1. (1)Mapのキーとなる配列telを生成します。
  2. (2)Mapの値となる配列areaを生成します。
  3. (3)コンストラクタの引数にtrueを指定し、アクセス順を保持するLinkedHashMapオブジェクトlhm1を生成します。
  4. (4)コンストラクタの引数にfalseを指定し、挿入順を保持するLinkedHashMapオブジェクトlhm2を生成します。
  5. (5)forループでlhm1、lhm2オブジェクトに要素を挿入します。
  6. (6)getメソッドを使用し、挿入順とは逆順でlhm1、lhm2オブジェクトの要素にアクセスします。
  7. (7)アクセス順を保持するlhm1オブジェクトの要素を表示します。
  8. (8)挿入順を保持するlhm2オブジェクトの要素を表示します。

実行結果2

D:\JAVA>javac ExCollection8.java

D:\JAVA>java ExCollection8
# アクセス順を保持するオブジェクトはアクセス順で、挿入順を保持するオブジェクトは挿入順で要素が保持されていることがわかります。
アクセス順 = {011=Hokkaido, 03=Tokyo, 052=Nagoya, 06=Osaka, 092=Fukuoka}

挿入順 = {092=Fukuoka, 06=Osaka, 052=Nagoya, 03=Tokyo, 011=Hokkaido}

D:\JAVA>

Mapのメソッド

HashMapクラス、TreeMapクラス、LinkedHashMapクラスの双方で定義されている主要なメソッドを紹介します。各クラスのメソッドの詳細は、APIリファレンスを参照してください。

戻り型 メソッド 説明
void clear( ) Mapからすべての要素を削除します。
boolean containsKey
(Object)
引数で指定されたキーが、Mapに存在する場合trueを返します。
boolean containsValue
(Object)
引数で指定された値が、Mapに存在する場合trueを返します。
Object get(Object) 引数に指定されたキーに紐付けられた値を返します。
Object put(Object,
Object)
指定された引数(キー, 値)を、Mapに挿入します。
void putAll(Map) 引数に指定されたMapの要素すべてを、Mapに挿入します。
Object remove
(Object)
引数に指定されたキーがMapに存在する場合、そのキーと紐付けられた値を削除します。
Set entrySet( ) Mapに格納されている要素を持つ、コレクションビューを返します。
Set keySet( ) Mapに格納されているキーを持つ、セットビューを返します。
Collection values( ) Mapに格納されている値を持つ、コレクションビューを返します。

4Map