hashmap修改对应key的值_死磕 java集合之HashMap源码分析

简介

HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;

继承体系

12faa1fea4331af5155299fba1929603.png

HashMap实现了Cloneable,可以被克隆。

HashMap实现了Serializable,可以被序列化。

HashMap继承自AbstractMap,实现了Map接口,具有Map的所有功能。

存储结构

215b86b2bb76a250a8284fb1fc25df46.png

在Java中,HashMap的实现采用了(数组 + 链表 + 红黑树)的复杂结构,数组的一个元素又称作桶。

在添加元素时,会根据hash值算出元素在数组中的位置,如果该位置没有元素,则直接把元素放置在此处,如果该位置有元素了,则把元素以链表的形式放置在链表的尾部。

当一个链表的元素个数达到一定的数量(且数组的长度达到一定的长度)后,则把链表转化为红黑树,从而提高效率。

数组的查询效率为O(1),链表的查询效率是O(k),红黑树的查询效率是O(log k),k为桶中的元素个数,所以当元素数量非常多的时候,转化为红黑树能极大地提高效率。

源码解析

属性

/** * 默认的初始容量为16 */static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;/** * 最大的容量为2的30次方 */static final int MAXIMUM_CAPACITY = 1 << 30;/** * 默认的装载因子 */static final float DEFAULT_LOAD_FACTOR = 0.75f;/** * 当一个桶中的元素个数大于等于8时进行树化 */static final int TREEIFY_THRESHOLD = 8;/** * 当一个桶中的元素个数小于等于6时把树转化为链表 */static final int UNTREEIFY_THRESHOLD = 6;/** * 当桶的个数达到64的时候才进行树化 */static final int MIN_TREEIFY_CAPACITY = 64;/** * 数组,又叫作桶(bucket) */transient Node[] table;/** * 作为entrySet()的缓存 */transient Set> entrySet;/** * 元素的数量 */transient int size;/** * 修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值