ConcurrentHashMap用法详解

ConcurrentHashMap 是 Java 并发编程中的一个线程安全的哈希表,它允许多个线程同时对其进行读写操作。相比于 HashMap,ConcurrentHashMap 在并发访问时不需要进行加锁,因此能够更好地满足高并发下的性能需求 ConcurrentHashMap 是一个线程安全、高效的哈希表,适用于多线程同时读写的场景

应用场合

  1. 多线程同时读写同一哈希表,且需要线程安全;
  2. 读多写少的情况,因为写操作仍然需要进行同步,可能会影响性能;
  3. 数据规模较大,不适合将所有数据存放在内存中;
  4. 需要支持高并发的场景,如 Web 应用中的缓存、计数器等。

用法

ConcurrentHashMap 与 HashMap 在 API 上基本相同,只是添加了一些支持并发访问的方法。下面是 ConcurrentHashMap 的用法:

创建

ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>();
ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>(initialCapacity);
ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>(initialCapacity, loadFactor);

存取元素

使用 put() 方法向哈希表中添加元素,使用 get() 方法获取指定 key 的值。与 HashMap 不同的是,ConcurrentHashMap 还提供了一些支持原子性操作的方法,如 putIfAbsent()、remove()、replace()

V value = map.get(key);
V value = map.put(key, value);
V oldValue = map.putIfAbsent(key, value);
V removedValue = map.remove(key);
boolean removed = map.remove(key, value);
boolean replaced = map.replace(key, oldValue, newValue);

遍历元素

使用 keySet()、values()、entrySet() 等方法可以获取哈希表中的键、值或键值对集合,然后对集合进行遍历

Set<K> keySet = map.keySet();
Collection<V> values = map.values();
Set<Map.Entry<K, V>> entrySet = map.entrySet();

for (K key : keySet) {
          
   
    // 遍历 key
}

for (V value : values) {
          
   
    // 遍历 value
}

for (Map.Entry<K, V> entry : entrySet) {
          
   
    K key = entry.getKey();
    V value = entry.getValue();
    // 遍历键值对
}

其他方法

ConcurrentHashMap 还提供了一些其他方法,如 size()、isEmpty()、containsKey() 等,与 HashMap 类似。

经验分享 程序员 微信小程序 职场和发展