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

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

関連記事

Javaのスレッドとは?概念やサンプルプログラムのご紹介

  <目次> (1) Javaのスレッドとは?概念やサンプルプログラムのご紹介  (1-1) Javaのスレッドとは?  (1-2) 方法①:Threadクラス継承の構文  (1-3) 方法 …

JavaのBigDecimalの使い方+初期化・四則演算・余り・累乗等の主要用途も紹介

<目的> (1) JavaのBigDecimalの使い方+初期化や四則演算・桁数設定等の主要用途も紹介  (1-1) 宣言の方法  (1-2) 代表的な用途(足し算・引き算・掛け算・割り算)  (1- …

JavaでJSON形式のデータから値を抽出する方法+代表的なエラー対処も紹介

(0)目次&概説 (1) 記事の目的  (1-1) 目的 (2) JSON形式の概要  (2-1) JSON形式とは?  (2-2) JSON形式のフォーマット (3) JSON形式の抽出方法・事前準 …

JSP/Servletでログイン・ログアウト機能を作成する方法

<目次> (1) JSP/Servletでログイン・ログアウト機能を作成する方法  (1-1) ログイン   (1-1-1) 概要・構文   (1-1-2) サンプルプログラム  (1-2) ログアウ …

クッキーとは?JSPでCookieを保存&取得するサンプルプログラムと代表的なメソッド紹介

(1) セッションとは (2) クッキーとは  (2-1) 概要  (2-2) サンプルプログラム   (2-2-1) 概要&画面遷移   (2-2-2) HelloCookie.jsp   (2-2 …

  • English (United States)
  • 日本語
Top