Java の HashMap、HashSet、Hashtable
Java の Collection
インターフェースは、さまざまなデータ構造とアルゴリズムを実装するためのさまざまなインターフェースとクラスを提供します。
このチュートリアルでは、Java の HashMap
、HashSet
、および 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 インターフェースをさらに拡張します。これは通常、キーを値のペアにマップする必要がない場合に使用されます。
HashSet
は Hashtable
とは異なり、HashSet
は重複する値を保持できません。キーと値のペアは一意です。機能面では、HashSet
は HashMap
と何の共通点もありませんが、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 で HashMap を初期化する
- Java で HashMap を並べ替える
- Java で HashMap をキーで並べ替える
- Java での Hashtable と Hashmap の違い
- Java における hashmap と map の違い