HashMap、HashTable、ConcurrentHashMap 区别 时间: 2018-03-06 23:16 分类: JDK ####HashMap 线程不安全,可以存储`key`或`value`为`null`的键值对。 ####HashTable 直接采用`synchronized`对`put`方法加锁,线程安全,但多线程环境中效率非常低下,`key`和`value`都不可以为`null`。 ####ConcurrentHashMap `key`和`value`都不可以为`null`。 jdk1.7 及以下: 实现采用 `Segment` 实现线程安全同步,`Segment`继承`ReentrantLock`实现加锁,默认为 16 个`Segment`,每个`Segment`包含一个`HashEntry`链表数组,即每次`put`操作,对`Segment`加锁,要锁住多个链表,效率较低。 jdk1.8以后: 数据结构与`HashMap`差不多,`put`操作直接用`synchronized`对`Node`链表头节点加锁,即每次只锁住一个链表。 还有一个优化就是当链表节点数大于等于 8 时,自动将链表结构转换为红黑树结构。 标签: 无