HashMap的理解

HashMap是Java中用于存储键值对的数据结构,它继承自Map和AbstractMap。内部实现采用了数组+链表+红黑树的方式处理哈希碰撞。当链表长度超过8时,会转换为红黑树以优化查询效率。扩容发生在哈希冲突且size超过阈值时,此时会创建新的2倍大小的数组并迁移元素,这是一项相对耗资源的操作。
摘要由CSDN通过智能技术生成

HashMap 用来存储存储键值对
继承自Map和AbstractMap
内部结构是数组加链表加红黑树
Hashmap会有一个哈希函数,哈希函数用来实现key和index之间的映射。通过hash还是计算出来的index会有有冲突,所以引出了哈希碰撞,当遇到哈希碰撞,在jdk1.8使用了链表加红黑树来处理。1.8之前使用的是链表。这里还有个小细节是1.8采用的尾插法,而1.7使用的是头插法。头插法会再多线程的情况下出现循环链表,尾插法优化了这一bug。为啥要使用红黑树呐,这是因为随着链表的增大,查询效率降低,因为红黑树,提高查询效率。
这里说一下,什么时候会扩容,发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。当链表长度大于8的时候会进行树华。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值