Java の ConcurrentHashMap と HashTable

Mohammad Irfan 2023年10月12日
  1. Java での ConcurrentHashMap の作成
  2. Java での HashTable の作成
Java の ConcurrentHashMap と HashTable

このチュートリアルでは、Java の ConcurrentHashMap と Hashtable の違いを紹介します。

ConcurrentHashMap は、java.util.concurrent フレームワークに属するクラスです。ConcurrentMap と Serializable インターフェイスを実装しています。スレッドセーフなデータを保存するために使用されます。複数のバケットを使用してデータを保存します。これの宣言構文は次のとおりです。

public class ConcurrentHashMap<K, V>
    extends AbstractMap<K, V> implements ConcurrentMap<K, V>, Serializable

ConcurrentHashMap キーポイント

  • スレッドセーフです。
  • マップ全体ではなく、セグメントレベルで複数のロックを使用します。
  • デフォルトで 16 個のロックを使用します。
  • 更新のロックにのみ適用されます。読み取るために、複数のスレッドがデータにアクセスできるようにします。

ConcurrentHashMap の例を見てみましょう。

Java での ConcurrentHashMap の作成

この例では、String 型と Integer 型のデータを保持する ConcurrentHashMap を作成しました。put() メソッドを使用して要素を追加し、getKey() メソッドと getValue() メソッドを使用してそれぞれキーと値にアクセスしました。以下の例を参照してください。

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SimpleTesting {
  ConcurrentHashMap<String, Integer> hm = new ConcurrentHashMap<String, Integer>();
  public void AddScore(String name, int score) {
    hm.put(name, score);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.AddScore("Rohan", 95);
    simpleTesting.AddScore("Sohan", 85);
    simpleTesting.AddScore("Mohan", 93);
    simpleTesting.AddScore("Lohan", 91);
    System.out.println("Students Scores: ");
    for (Map.Entry<String, Integer> entry : simpleTesting.hm.entrySet()) {
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

出力:

Students Scores: 
Lohan - 91
Mohan - 93
Sohan - 85
Rohan - 95

HashTable は、Java コレクションフレームワークに属するクラスです。キーと値のペアでデータを格納するために使用されます。Map、Cloneable、および Serializable インターフェイスを実装します。クラス宣言を以下に示します。

public class Hashtable<K, V> extends Dictionary<K, V> implements Map<K, V>, Cloneable, Serializable

HashTable のキーポイント:

  • データ全体に単一のロックを使用します。
  • スレッドセーフです。つまり、同期されています。
  • null キーまたは null 値は許可されません。

HashTable の例を見てみましょう。

Java での HashTable の作成

この例では、文字列と整数型のデータを格納する HashTable を作成しました。put() メソッドを使用して要素を追加し、getKey() メソッドと getValue() メソッドを使用してそれぞれキーと値にアクセスしました。以下の例を参照してください。

import java.util.Hashtable;
import java.util.Map;

public class SimpleTesting {
  Hashtable<String, Integer> hm = new Hashtable<String, Integer>();
  public void AddScore(String name, int score) {
    hm.put(name, score);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.AddScore("Rohan", 95);
    simpleTesting.AddScore("Sohan", 85);
    simpleTesting.AddScore("Mohan", 93);
    simpleTesting.AddScore("Lohan", 91);
    System.out.println("Students Scores: ");
    for (Map.Entry<String, Integer> entry : simpleTesting.hm.entrySet()) {
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

出力:

Students Scores: 
Rohan - 95
Mohan - 93
Sohan - 85
Lohan - 91