hashmap源码学习

最近面试被问到了hashmap源码,所以再次认真学习整理一下(基于jdk1.7)。

hashmap主要由数组和链表组成,数组是hashmap的主体,链表是为了解决hash冲突而设计的。entry是hashmap的基本组成单元。每个entry包含一对key-value的键值对。

entry主要包括四个属性,key,value,hash,entry<K,V> next,其中hash为key进行hash运算后的值,next为下一个entry的引用,当next为null时不存在hash冲突。当hash查找时若next为null,直接返回当前value,若next不为空,则进行链表遍历并比较key实体,查找指定的key。

size:键值对数量

capacity:数组大小。默认初始值为16。扩容大小为2的n次方。

threshold:数组扩容的阀值。capacity*loadfactor,当数组长度超过阀值,数组进行扩容。

loadFactor:数组填充度,默认0.75

当调用put方法时,先判断是否需要扩容,然后判断hash是否冲突,若没有冲突则生成新的节点并放入数组中。如果冲突则进行遍历链表,如果链表中已经存在key则直接进行替换,否则在链表结尾新增节点。

调用get方法时类似,先对key进行hash计算,然后找到key对应的数组下标,遍历链表取值。

jdk1.8对hashmap进行了优化,主要修改部分为entry换为node,当链表长度超过8时采用红黑树结构。

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值