HashMap、HashTable、ConcurrentHashMap

60 阅读1分钟

HashMapHashTableConcurrentHashMap 都是 Java 中实现了 Map 接口的类,但它们在线程安全性、性能等方面有一些区别。以下是对每个类的简要概述:

  1. HashMap:

    • 线程安全性: 非线程安全。如果多个线程同时访问 HashMap,并且至少有一个线程对地图进行结构性修改(例如添加或删除条目),则必须在外部同步或使用 Collections.synchronizedMap 进行包装。
    • 性能: 通常比 HashTable 快,因为它是非同步的。
    • 空键和值: 允许一个空键和多个空值。
Map<K, V> hashMap = new HashMap<>();
  1. HashTable:

    • 线程安全性: 同步的,也就是说是线程安全的。所有方法都是隐式同步的,因此可以在多线程环境中安全使用。
    • 性能: 由于同步,通常比 HashMap 慢一些。
    • 空键和值: 不允许空键或值。如果尝试插入空键或值,将引发 NullPointerException
Map<K, V> hashTable = new Hashtable<>();
  1. ConcurrentHashMap:

    • 线程安全性: 提供高度的并发性。多个线程可以同时读取和写入,争用最小。
    • 性能: 在并发环境中通常比 HashTable 更快。通过将地图分成段,允许不同的线程同时操作不同的段,实现了高效的并发。
    • 空键和值: 不允许空键或值。
Map<K, V> concurrentHashMap = new ConcurrentHashMap<>();

总的来说,如果需要一个线程安全的映射,并且可以使用 Java 5 或更高版本,通常情况下 ConcurrentHashMap 是更好的选择,因为它在并发场景中性能更好。如果在单线程环境中工作或可以在外部处理同步,可能 HashMap 更高效。HashTable 是一个较老的类,通常被认为比 HashMapConcurrentHashMap 效率低。