面试题:谈谈你对HashMap的理解?

HashMap是一种存取高效但不保证有序的集合,它的数据结构在1.7里面是数组加链表,在1.8之后是数组链表加红黑树。
HashMap的默认初始大小是16,加载因子默认0.75,默认的阈值是容量和加载因子的乘积,当存储节点的数量超过阈值,就会对其进行扩容操作。
在put的时候会先判断数组是否为空,如果为空,先进行数组的初始化操作,初始化完成,再进行put的操作。如果数组不为空,以数组的长度减一与key的hash值进行与运算,得到元素在数组中的位置:
如果数组下标位置为空:则将对应的key、 value 封装成一个对象放入该数组位置。
如果数组下标位置不为空:
在1.7里面先判断是否需要扩容,如果需要扩容就先扩容,如果不需要扩容,遍历链表的key值,如果存在要插入的key值,直接更新value即可,如果不存在就将key、value封装成Entry对象,使用头插法的方式将对象添加到链表中。
在1.8里面,会先判断数组位置上的Node是链表还是红黑树:
如果是链表,将key、value封装成一个链表的Node节点,然后遍历链表,如果存在插入的key,直接更新value即可,如果不存在就插入到链表的最后一个位置上。插入到链表后会更新链表的长度,如果链表的长度大于等于8,且数组长度大于64,则会将链表更新为红黑树。【如果链表长度大于8,但是数组长度小于64,此时并不会将链表转化为红黑树,而是进行扩容操作】
如果是红黑树,则将key、value封装成红黑树的Node节点,并将其添加到红黑树中,并且这个过程会判断红黑树中是否存在要插入的key,如果存在,直接更新value即可。
将key封装成Node对象将其插入到链表或者红黑树之后,再判断是否需要进行扩容操作。如果需要就进行扩容的操作,如果不需要扩容那么就退出put方法。返回执行的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值