一、HashMap的存储过程是怎么样的?
- 使用hashcode()计算当前key对应的hash值
- 因为是使用数组存储k-v构成的node结点的,应将hash映射到数组的下标位置
- 查看是否发生hash冲突,未发生则直接将当前node存储在此处,若冲突看value值是否一致,不一致则在此处以拉链法方式解决冲突
二、hash映射到下标是如何映射的?
hash值是int型,初始数组大小为2的倍数,但肯定是没有int范围那么大的,假设大小为8,那所有的hash值都与7进行按位&,达到映射的效果
三、HashMap底层实现是怎么样的?
- 底层数据结构是使用数组+链表+红黑树
- 当链表长度达到8时开始转换成红黑树
- 红黑树属于二叉搜索树,是二叉平衡树的变种,给予节点红或黑,相较于AVL,它旋转次数更少,适用于增删查操作多的情况
四、HashMap是怎么出现死循环的?
- hashmap的扩容操作中的transfer方法对原数据进行移动
- 由于之前的版本采用的是头插法,当原来的一条链式数据移动到同一位置
- 移动完成后,当前的数据链会是原本数据链反过来
- 在多线程情况下,若原先数据链为a、b、c、d,一号线程在执行到指针e指向a,e.next指向b时
- 二号线程直接将转移动作完成,这时候数据链中b.next是指向a的,而transfer方法中的下一条语句是a.next指向b,构成了死循环