hashmap源码阅读

一、背景

     hashmap是高效的基于键值对存储的工具,在数据存储、检索、扩容等方面非常快速,在开源框架中基本都能看到其身影。首先它是基于内存来存储的,存储所用的数据结构为数据和链表,数组具有高效检索的特别,链表便于增删。它解决了这些问题:如果快速的进行存取,当数据量很大的时候。首先它是基于hash算法和数据来实现高效地定位,在java里面,每个对象都有一个对应的hashcode相当于身份证,这个值是int类型的,通过这个hashcode值,我们可以进行hash计算,得到对象在数字中的位置,可以直接查到数据,时间复杂度为o(1),前提是数组上没有链表,当有链表的时候会在链表上逐一进行遍历。另外,当整个数组和链表上的数据达到一定的容量,就会进行扩容了,因为数据量太大之后,会产生很多冲突,导致查询去链表上逐一比较,为了提高速度,会进行扩容来避免冲突,提高检索速度。

二、关键点

1.在使用hashcode的时候,为了避免hash冲突,使用了位运算来使得尽量每一位都能参与到计算

2.进行hash的时候,使用了&运算,而不是用取模,使得处理效率更高了

3.链表上面为了避免太长,使用了红黑树,使得链表能够自动平衡不至于太长

4.是允许key为null的,当为null的时候,存在第一位

三、其他

重写equals方法的时候,记得也要重写hashcode方法,不然在使用hashmap的时候,两个对象本意是以为相等的,但在hashmap中肯能会当做两个对象来存储。

相关内容参考:

https://blog.csdn.net/justloveyou_/article/details/72783008

https://blog.csdn.net/justloveyou_/article/details/62893086

https://www.cnblogs.com/chenssy/p/3521565.html

https://www.iteye.com/topic/709945

https://blog.csdn.net/yue_hu/article/details/80661438

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>