HashMap | HashTable | ConcurrentHashMap | |
key为null | 可以,但为null的key只有一个 | 不可以 | 不可以 |
value为null | 可以 | 不可以 | 不可以 |
hash值 | 重新计算hash值 | 直接使用对象的hashcode | 重新计算hash值 |
结构内部 | 数组+链表+红黑树 | 数组+链表 | 数组+链表+红黑树 |
是否多线程安全 | 否 | 是 | 是 |
怎样实现多线程安全 | 所有方法都使用sychronized关键字加锁 | jdk1.7使用segment+reentraclock; jdk1.8之后,对数组的节点Node加锁;在put操作的时候,如果node上没有value,则使用cas自旋插入元素;反之,则使用sychronized加锁;在get操作的时候,不进行加锁,使用volatile关键字保证value的可见性 |
HashMap、HashTable、ConcurrentHashMap对比
于 2024-04-28 21:24:54 首次发布