1. HashMap相关面试题
1.1 HashMap中的常识性问题
- HashMap的底层数据结构(jdk1.8)
数组+链表+红黑树
- HashMap的数组初始化长度是多少吗?
初始长度为0,当我们第一次调用put方法时就会
初始化长度为16的数组
(容量必须是2的幂)
- 讲讲HashMap的hash函数,以及为什么这么设计?
HashMap的hash函数是调用key的hashCode方法得到一个32位的int值,然后再让高低16位进行异或运算得到的.
作用:充分利用到每一个比特位,使得生成的hashcode更加均匀,减少哈希冲突
异或运算:相同为0,不同为1(00=0;11=0;1^0=1)
- 你知道负载因子为什么是0.75吗?
选取0.75是基于时间和空间的一个平衡,负载因子越大哈希表的填装程度就越高,当访问速度随之降低,因为哈希表越满,越有可能产生链表和红黑树结构。
- 哈希表的扩容,树化和链化(难)
- 当链表长度达到8时进行树化
- 当红黑树元素数量降到6时进行链化
- 当元素超过数组长度*负载因子时,扩容为原来的两倍
1.2 HashMap中get方法的具体过程⭐
- 向调用hash方法计算出hash值,然后根据hash计算出所在数组的位置
- 如果key是一致的就将数据进行返回
- 如果查到该位置是链表就在链表中进行查找
- 如果查到该位置是红黑树结构就在红黑树中进行查找
1.3 HashMap中put方法的具体过程⭐
- 向判断数组是否为空,为空进行初始化
- 通过(n - 1) & hash计算数组中的位置
- 该位置中没有元素则直接存放元素
- 如果有元素存在说明发生了hash冲突,使用equals方法判断key是否相等,相等则覆盖value
- 如果如果是树型节点,创造树型节点插入红黑树中;
- 如果是链表的话逐个判断key是否相等,相等就覆盖value,不相等就创建普通Node加入链表中;,还要判断链表长度是否大于 8并且数组长度大于64, 大于的话链表转换为红黑树;
2021年6月24日10:08:34 持续更新…