栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HashMap源码学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HashMap源码学习

HashMap源码学习
  • 文档注释
  • 代码学习

文档注释


说明:①允许key和value为null ②线程不安全 ③无序

说明:①元素合适地分布在桶中,get和put方法效率为常量时间②集合迭代时间与(hashmap容量和键值对数量成正比,因此初始容量不能过大,加载因子不能过小)

说明:①两个参数,初始容量是创建时设定的容量,加载因子决定了何时扩容(元素数量超过容量×加载因子),扩容时rehash,2倍扩容。

说明:默认的加载因子为0.75,可以在时间和空间成本上很好的权衡。尽量设置合适地初始容量,频繁rehash会降低效率。

说明:HashMap非线程安全,多线程是必须额外保证,也可以创建时使用Collections.synchronizedMap。

说明:快速失败,同HashSet。

代码学习


说明:HashMap继承自AbstractMap,实现了Map接口,克隆及序列化。

说明:hashmap以桶的形式存在,桶中数据过多会转化成树节点,这可以快速查找。

说明:树节点主要是根据hashCode排序的。

说明:树节点是常规节点的两倍,因此只在节点多的时候树化,节点少就反树化。节点频率呈泊松分布,一个bin中有8个节点的频率很低,因此链表长度为8才树化。

说明:常量设置。初始容量必须为2的n次方,为16,bin中有8个元素树化,树bin中6个元素反树化,表容量超过64才树化。

说明:普通entry节点。

说明:①异或,让高位参与运算减少hash冲突 ②当key为null,hash值为0,即存到0号bin。

说明:将给定的容量转化为2的幂。

说明:一些属性,modCount为hashmap被修改的次数。


说明:put流程:① 如果当前是空数组,初始化新建数组 ② 要插入的位置无元素,新建并放入。③【—①该数组位置节点相同,原始节点赋值给新元素。 ②该节点是树节点,以树的方式putVal()。 ③循环链表,如果遇到相同元素,结束循环,如果遍历到最后一个元素,则加入新元素,判断是否树化。④ 如果key已经存在,覆盖value】 ④ 判断是否需要扩容。

说明:扩容准备:2倍的capacity和threshold,如果是旧数组为0,即为初始化时,默认容量。

说明:具体扩容流程:循环旧数组中的元素,① 若为数组元素,计算新位置并放入。 ②树节点按树的方式分裂。 ③链表节点时,do-while循环链表,新建两个链表,判断旧元素应在的位置,分为原数组位置 i 和原数组 i+n 处,以尾插法的方式插入。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/924543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号