大纲和问题:
- 核心数据结构,(为什么链表长度大于8后,链表会转红黑树?)
- 初始化容量为什么是2的指数幂?加载因子为什么是0.75?
- jdk7的hashmap扩容死锁与环链行程分析
- jdk8扩容优化,如何做到扩容无需rehash
- ConcurrentHashMap线程安全吗?什么是分段锁?
笔记:
- 数据结构:数组+链表+红黑树(>1.7)
正常的是数组结构,出现hash碰撞则会出现链表,链表长度大于8则会出现红黑树,因为普通链表的查询效率比数组低的多,但是红黑树插入性能很低(左旋右旋,重新着色);为什么是8呢,从概率上来说(泊松分布),同一个位置出现相同的key的概率会越来越低,达到8的时候,已经很低了,这里转红黑树对插入效率影响较小,且可以提高查询效率; - 链表的长度>=8链表转红黑树
- 初始化容量为什么是2的指数幂:hashmap定位使用的是位运算,而位运算比取模效率高得多,为了保证位运算和取模效果相同,容量大小最好是2的指数幂,关键代码:indexFor(hash, table.length)
- 加载因子为什么是0.75?如果设置为1,则hash碰撞概率增大,查询效率变慢;如果设置的太小,则空间利用率太低,浪费空间