TreeMap
- 红黑树
HashMap
- 高低位
- 单向链表转双向链表和红黑树
ConcurrentHashMap
- 高低位
- 单向链表转双向链表和红黑树
- 扩容戳(高16位表示扩容状态,低16位表示参与的线程数)
- 多线程迁移数据
- 高并发场景下的原子递增(效仿LongAdder)
个人看法
- 如果想学习红黑树的代码实现,就看TreeMap
- “高低位”的核心在于使用了合适的哈希函数以及每次扩容时数组长度都增加一倍
- “扩容戳”本质上是压缩数据
- 因为LongAdder无法向外界透露当前竞争是否激烈,所以ConcurrentHashMap没有直接使用LongAdder。在竞争激烈的情况下,即便负载达到甚至超过75%,ConcurrentHashMap也不会进行扩容