HashTable, HashMap, ConcurrentHashMap 之间的区别
时间: 2023-10-27 14:36:20 浏览: 146
有关hashMap跟hashTable的区别,说法正确的是?
HashTable、HashMap、ConcurrentHashMap 都是存储键值对的容器,其区别如下:
1. HashTable 与 HashMap
HashTable 是线程安全的,HashMap 不是线程安全的。在并发环境下,HashTable 性能表现比 HashMap 差。
HashTable 不允许 key 或 value 为 NULL,而 HashMap 允许 key 或 value 为 NULL。
HashTable 进行 resize 时,会锁住整个 HashTable 表,导致所有操作被阻塞;而 HashMap 初始大小固定,resize 导致效率低下,但是 JDK1.8 之后 HashMap 进行 resize 时,并不会锁整个 HashMap,而是只锁住相关 Node 链表,这一点在多线程环境中大大提高了效率。
2. HashMap 与 ConcurrentHashMap
HashMap 是非线程安全的,ConcurrentHashMap 是线程安全且并发性高的。
ConcurrentHashMap 采用分段锁技术,将哈希表分为多个 Segment(段),每个 Segment 采用独立锁实现并发控制,不同线程访问不同 Segment 时,不会发生锁竞争,从而提高了并发访问效率。而 HashMap 在并发访问时需要采用锁机制进行同步,锁竞争导致效率降低。
总结:如果需要在多线程环境下使用容器,建议使用 ConcurrentHashMap;如果对容器线程安全没有要求,且在单线程环境下访问比较频繁,推荐使用 HashMap。而因为 HashTable 性能比较低,建议尽量避免使用 HashTable。
阅读全文