Java の ConcurrentHashMap と HashTable
Mohammad Irfan
2023年10月12日
このチュートリアルでは、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