Java の HashMap、HashSet、Hashtable

Hiten Kanwar 2023年10月12日
  1. Java HashMap
  2. Java Hashtable
  3. Java HashSet
Java の HashMap、HashSet、Hashtable

Java の Collection インターフェースは、さまざまなデータ構造とアルゴリズムを実装するためのさまざまなインターフェースとクラスを提供します。

このチュートリアルでは、Java の HashMapHashSet、および Hashtable について説明します。

まず、一般的なハッシュテーブルとは何かを理解しましょう。

ハッシュテーブルを使用して、要素をキーと値のペアパターンで格納できます。つまり、すべてのキーに値が関連付けられています。キーは、値のインデックス付けに使用される一意の値です。値は、対応するキーに関連するデータです。

ハッシュテーブルのデータ構造は、新しいインデックスがキーを使用して処理されるハッシュの概念に従います。次に、そのキーに対応する要素がインデックスに格納されます。これがハッシュの概念です。

h(x) をハッシュ関数とし、k をキーとすると、h(k)k にリンクされた要素を格納するための新しいインデックスを提供します。

Java HashMap

HashMap は、ハッシュテーブルのデータ構造を提供する Java のコレクションフレームワークのクラスです。要素をキーと値のペアとして格納します。キーは、マップ上の特定の値とペアになっている一意の識別子です。HashMap クラスは、Collections インターフェースをさらに拡張する Map インターフェースを実装します。

HashMap は同期されていません。つまり、スレッドセーフではありません。複数のスレッドを使用してアクセスし、同時に変更することができます。外部でスレッドセーフにすることができます。

HashMap のもう 1つの特徴は、null キーまたは値のペアを保持できることです。

例えば、

import java.util.HashMap;

public class Main {
  public static void main(String[] args) {
    HashMap<String, Integer> h = new HashMap<>();
    h.put("One", 1);
    h.put("Two", 2);
    h.put("Three", 3);
    System.out.println(h);
  }
}

出力:

HashMap: {One=1, Two=2, Three=3}

Java Hashtable

Java の Hashtable クラスは、ハッシュテーブルのデータ構造を実装します。HashMap と同様に、要素もキーと値のペアとして格納されます。ただし、同期されているため、HashMap とは異なります。キーと値のペアをハッシュテーブルに格納します。Map インターフェースを実装します。

まず、Hashtable で、オブジェクトをキーとして指定し、その値をペアとして指定します。次に、キーがハッシュされ、結果のハッシュコードが、テーブル内に格納されている値のインデックスとして使用されます。

このため、Hashtable に関連する問題は、各メソッド呼び出しの同期が比較的重要ではないことです。毎回必要というわけではありません。したがって、この問題を克服するために、コレクションフレームワークの作成者は、同期されていない HashMap(要素をマップすることも明確にする)と呼ばれる新しいクラスを考案しました。

メソッドレベルの同期を使用したくない場合は、Hashtable をスキップして、マップを同期マップに変換する Collections.synchronizedMap() を使用できます。または、ConcurrentHashMap を使用することもできます。これは、ドキュメントによると、Hashtable と同じ機能を提供しますが、パフォーマンスが向上し、いくつかの追加機能があります。

例えば、

import java.io.*;
import java.util.*;

public class Main {
  public static void main(String args[]) {
    Hashtable<Integer, String> h = new Hashtable<>();
    h.put(1, "one");
    h.put(2, "two");
    h.put(3, "three");
    System.out.println(h);
  }
}

出力:

{3=three, 2=two, 1=one}

Java HashSet

HashSet は、Java のコレクションフレームワークのクラスであり、ハッシュテーブルデータ構造の実装を提供します(HashMap と同様)。それでも、(HashMap とは異なり)Set インターフェースを実装し、Collections インターフェースをさらに拡張します。これは通常、キーを値のペアにマップする必要がない場合に使用されます。

HashSetHashtable とは異なり、HashSet は重複する値を保持できません。キーと値のペアは一意です。機能面では、HashSetHashMap と何の共通点もありませんが、Set インターフェイスを実装するために内部で HashMap を使用することがあります。

例えば、

import java.util.HashSet;

public class Main {
  public static void main(String[] args) {
    HashSet<Integer> h = new HashSet<>();
    h.add(5);
    h.add(10);
    h.add(15);
    System.out.println(h);
  }
}

出力:

[5, 10, 15]

関連記事 - Java HashMap

関連記事 - Java Hashtable