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