HashMap的底层原理

在jdk1.6和jdk1.7中HashMap是桶加链表的实现方式.HashMap的底层结构就是一个数组,数组中每一个元素又是一个链表.当添加一个元素(key-value)的时候,根据key的hash值(或者说调用key的hashCode方法)来确定插入到哪一个桶中(确定插入数组中的位置),当桶中有多个key元素时,使用链表进行保存,这代表发生了哈希码的碰撞,这时判断同一个桶中的元素是否相同就需要调用equals方法进行判断,其实HashMap很少用到equals方法,equals方法只要在哈希码碰撞的时候才会使用的方法. 当一个桶中存放的数据过多,那么根据key查找的效率就会降低

HashMap通过hashCode和equals最终判断出K是否已存在,如果已存在,则使用新V值替换旧V值,并返回旧V值,如果不存在 ,则存放新的键值对<K, V>到bucketIndex位置

为了解决这个问题

当数组的容量超过初始容量(默认为16)的0.75(负载因子)时,将数组中的长度扩大为原来的2倍(也就是通常所说的rehash操作),由于容量发生变化,原有的每个元素需要重新计算bucketIndex,再存放到新数组中去(HashMap源码中的resize),虽然扩容比较耗时,但是扩容一次后很久就不用再扩容

在jdk1.8中,HashMap采用桶+链表+红黑树实现,当链表的长度超过8时,将链表转化为红黑树(红黑树的查询时复是O(lgn),而链表的查询时间复杂度是O(n))

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值