2021-01-06

[学习日记]简述hashmap

hashmap的底层实现 jdk7
当new hashmap()以后,底层创建了 一个是长度是16的一维数组,数组的类型是Entry[] 类型,数组的名称叫table,当map调用put()方法时,可能之前已经调用了多次put()了,我们希望把我们的key value放入到我们的数组中,首先,调用key所在类的hashcode()方法计算key的hash值,此hash值经过某种算法计算以后,得到在Entry数组中的存放位置,如果此位置的数据为空,则直接添加,如果此位置的数据不为空,意味此位置上存在一个或者多个数据(以链表形式存在),比较key和已经存在数据的hash值,如果key的hash值和已经存在的数据的hash值都不相同,此时key value就添加成功,如果key的hash值和已经存在的数据的hash值相同,则继续比较,调用key所在类的equals()方法比较,如果equels()返回false,key value就添加成功,如果equels()返回true,使用value去替换相同key的value值
在不断的添加过程中,会涉及到扩容的问题,默认的扩容方式为原来容量的2倍,并将原有的数据复制过来

jdk8相较于jdk7的不同
在new hashmap()时,底层没有创建一个长度为16的数组,jdk8底层的数组为node()类型,而非entry类型,首次调用put方法是,底层去创建长度为16的数组,jdk7的底层结构只有数组+链表,jdk8的底层结构数组+链表+红黑树,当数组的某一个索引位置上元素以链表形式存在的数据个数 >8,且当前数组的长度超过64,此时索引位置上的数据改为红黑树存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值