HashMap常见面试题

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是基于时间和空间的一个平衡,负载因子越大哈希表的填装程度就越高,当访问速度随之降低,因为哈希表越满,越有可能产生链表和红黑树结构。

  • 哈希表的扩容,树化和链化(难)
  1. 当链表长度达到8时进行树化
  2. 当红黑树元素数量降到6时进行链化
  3. 当元素超过数组长度*负载因子时,扩容为原来的两倍

1.2 HashMap中get方法的具体过程⭐

  1. 向调用hash方法计算出hash值,然后根据hash计算出所在数组的位置
  2. 如果key是一致的就将数据进行返回
  3. 如果查到该位置是链表就在链表中进行查找
  4. 如果查到该位置是红黑树结构就在红黑树中进行查找

1.3 HashMap中put方法的具体过程⭐

  1. 向判断数组是否为空,为空进行初始化
  2. 通过(n - 1) & hash计算数组中的位置
  3. 该位置中没有元素则直接存放元素
  4. 如果有元素存在说明发生了hash冲突,使用equals方法判断key是否相等,相等则覆盖value
  5. 如果如果是树型节点,创造树型节点插入红黑树中;
  6. 如果是链表的话逐个判断key是否相等,相等就覆盖value,不相等就创建普通Node加入链表中;,还要判断链表长度是否大于 8并且数组长度大于64, 大于的话链表转换为红黑树;

2021年6月24日10:08:34 持续更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值