ConcurrentHashMap用法详解
ConcurrentHashMap 是 Java 并发编程中的一个线程安全的哈希表,它允许多个线程同时对其进行读写操作。相比于 HashMap,ConcurrentHashMap 在并发访问时不需要进行加锁,因此能够更好地满足高并发下的性能需求 ConcurrentHashMap 是一个线程安全、高效的哈希表,适用于多线程同时读写的场景
应用场合
- 多线程同时读写同一哈希表,且需要线程安全;
- 读多写少的情况,因为写操作仍然需要进行同步,可能会影响性能;
- 数据规模较大,不适合将所有数据存放在内存中;
- 需要支持高并发的场景,如 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 类似。