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 主要特點:

  • 它是執行緒安全的。
  • 它在段級別而不是整個 Map 上使用多個鎖。
  • 預設使用 16 個鎖。
  • 它僅適用於更新鎖定。對於讀取,它允許多個執行緒訪問資料。

讓我們看一個 ConcurrentHashMap 的例子。

在 Java 中建立 ConcurrentHashMap

在這個例子中,我們建立了一個 ConcurrentHashMap 來儲存 String 和 Integer 型別的資料。我們使用 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 的例子。

在 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