Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)

投稿日:2021年5月8日 更新日:

<目次>

(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インターフェイス」として利用できます。

通常ArrayListといった「List」は数字等の「インデックス」に「値」(データ)を紐づけて保持しているのに対して、「Map」インターフェイスを実装したクラス(HashMap、LinkedHashMap、TreeMap)では「キー」と呼ばれる文字列に「値」を紐づけしており「連想記憶」とも呼ばれます。
 

(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も重複したキーを許容しないようになっています。

(注意点)
ただし、通常のHashMapは表の通り「順番の保証」がなく、要素がどこに追加されるか分からない(ランダム)ため、例えば「昇順ソート」を自動で行いたい場合は「TreeMap」の方が適していますし、putした順序でループしたい場合は「LinkedHashMap」の方が適しています。
 

(1-3) 各マップの概要&サンプルプログラム

各Classについて、挙動のイメージを掴むための簡単なサンプルプログラムをご紹介いたします。

(1-3-1) HashMap

HashMapは最もマップの中では最もシンプルで、Hash(ハッシュ)というのはMapの構造を実現するために使われている技術です。具体的にはStringといったデータから一定のルールに従って計算された値を「ハッシュ値」と呼び、ハッシュというと「ハッシュ値」あるいは「ハッシュの計算に使った関数」を指します。

下記のサンプルプログラムの特徴として、Mapの「キー」は「String」に対して「値」は「Object」型にしており、Stringやintなど複数の型を受け取れるようにしています。正確には、int型などの「プリミティブ型」の場合は、書き込む際に「オートボクシング」(プリミティブ型を対応するラッパークラスへ自動で変換する機能)が作動し、実際は「Integer」オブジェクトとして格納されています。
 
但し、値を取り出す時はキャスト等が必要になってきます。
(例)int型を取り出すためのキャスト

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キーを入れようとすると例外が発生します。

(図133)
 
またソート順に関しても、キーの順序でソートされるという特徴があります。サンプルの例ですとname⇒origin⇒quantitiyの順でソートされています。
 
(図134)
 

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Failed to execute goal org.apache.mavenエラーの原因と対処(Spring BootのMavenプロジェクトで発生)

  <目次> (1) Failed to execute goal org.apache.mavenエラーの原因と対処(Spring BootのMavenプロジェクトで発生)  (1-1) …

GitHubのWebAPIをコールしてユーザー情報を取得するサンプルプログラムの解説+エラー対応も2例紹介

(0)目次&概説 (1) 目的  (1-1) 記事の目的 (2) APIの概要  (2-1) APIとは?  (2-2) Web APIとは?  (2-3) Web APIの様々な呼び方   (2-3 …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

Javaで正規表現を使ってURLを文字列から検出する方法

<目次> (1) Javaで正規表現を使ってURLを文字列から検出する方法  (1-1) 構文  (1-2) 構文の説明  (1-3) サンプルプログラム  (1-4) ツールのご紹介 (1) Jav …

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート1:仕様説明編)

(0)目次&概説 (1) 仕様について  (1-1) アーキテクチャ(アプリ/DB)  (1-2) アプリの仕様概要  (1-3) データベースの仕様概要 (2) ソースコード (3) エラー対応 ( …

  • English (United States)
  • 日本語
Top