普歌-允异团队-HashMap面试题

HashMap

在这里插入图片描述

1.hashMap 工作原理

HashMap是基于hashing的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

  • HashMap是在bucket中储存键对象和值对象,作为Map.Entry。
    哈希冲突原因

key计算出一个hashcode,hashcode与“操作”计算出数组下标
在把put进来的key,value封装为一个entry对象
判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
如果该下标对应的位置不为空,则需要把entry插入到链表中
并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
如果是JDK7,则使用头插法
如果是JDK8,则遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中

2.HashMap在JDK7 ,JDK8 中的区别

  • JDK8
    通过数组+链表+红黑树来实现
    使用了红黑树保证了插入和查询了效率,所以实际上JDK8中的Hash算法实现的复杂度降低了
    数组扩容的条件也变化了,只会判断是否当前元素个数是否查过阈值,而不再判断当前put进来的元素对应的数组下标位置是否有值。
  • JDK7
    数组+链表实现
    链表的插入是用的头插法,而JDK8中改为了尾插法
    先扩容再添加新元素,JDK8 先添加新元素然后再扩容

3. DK8中链表转变为红黑树的条件?

链表中的元素的个数为8个或超过8个。满足当前数组的长度大于或等于64才会把链表转变为红黑树。

4 .链表转变为红黑树的目的

解决链表过长,导致查询和插入效率慢的问题
如果要解决这个问题,也可以通过数组扩容,把链表缩短也可以解决这个问题
在数组长度还不太长的情况,可以先通过数组扩容来解决链表过长的问题。

HashMap面试题(续)


  • 作者:麦克猫Cat

  • 本文版权归作者和CSDN共有,欢迎交流

猜你喜欢

转载自blog.csdn.net/weixin_52309367/article/details/115566918