位置: IT常识 - 正文

HashMap源码,看我这篇就够了(hashmap resize源码)

编辑:rootadmin
HashMap源码深度剖析 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题) * HashMap成员变量(初始化容量是多少、负载因子、数组长度为什么是2的n次幂) * HashMap扩容机制(什么时候需要扩容? 怎么进行扩容?) * JDK7 与 Jdk8比较,J ... HashMap源码深度剖析 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题) * HashMap成员变量(初始化容量是多少、负载因子、数组长度为什么是2的n次幂) * HashMap扩容机制(什么时候需要扩容? 怎么进行扩容?) * JDK7 与 Jdk8比较,JDK8进行了什么优化?1 定义

推荐整理分享HashMap源码,看我这篇就够了(hashmap resize源码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:hashmap1.8源码,hashmap的源码,实现原理,底层结构,hashmap的源码,实现原理,底层结构,hashmap1.7源码分析,hashmap源码深度解析,hashmap1.7源码分析,hashmap 源码,hashmap 源码,内容如对您有帮助,希望把文章链接给更多的朋友!

HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

JDK1.7 HashMap数据结构:数组 + 链表JDK1.8 HashMap数据结构:数组 + 链表 / 红黑树

思考:为什么1.8之后,HashMap的数据结构要增加红黑树?

2 哈希表

Hash表也称为散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构。也就是说它通过把关键码值映射到表中的一个位置来访问记录,以此来加快查找的速度。在链表、数组等数据结构中,查找某个关键字,通常要遍历整个数据结构,也就是O(N)的时间级,但是对于哈希表来说,只是O(1)的时间级

哈希表,它是通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表,只需要O(1)的时间级

思考:多个 key 通过散列函数会得到相同的值,这时候怎么办?

解决:

HashMap源码,看我这篇就够了(hashmap resize源码)

​(1)开放地址法

​(2)链地址法

对于开放地址法,可能会遇到二次冲突,三次冲突,所以需要良好的散列函数,分布的越均匀越好。对于链地址法,虽然不会造成二次冲突,但是如果一次冲突很多,那么会造成子数组或者子链表很长,那么我们查找所需遍历的时间也会很长。

3 JDK1.8前HashMap的数据结构JDK 8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,极端情况HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。

4 JDK1.8后HashMap的数据结构JDK 8 后 HashMap 的实现是 数组+链表+红黑树桶中的结构可能是链表,也可能是红黑树,当链表长度大于阈值(或者红黑树的边界值,默认为8)并且当前数组的长度大于64时,此时此索引位置上的所有数据改为使用红黑树存储。

5. 类构造器public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {

 JDK 为我们提供了一个抽象类 AbstractMap ,该抽象类继承 Map 接口,所以如果我们不想实现所有的 Map 接口方法,就可以选择继承抽象类 AbstractMap 。

HashMap 集合实现了 Cloneable 接口以及 Serializable 接口,分别用来进行对象克隆以及将对象进行序列化。

注意:HashMap 类即继承了 AbstractMap 接口,也实现了 Map 接口,这样做难道不是多此一举?

据 java 集合框架的创始人Josh Bloch描述,这样的写法是一个失误。在java集合框架中,类似这样的写法很多,最开始写java集合框架的时候,他认为这样写,在某些地方可能是有价值的,直到他意识到错了。显然的,JDK的维护者,后来不认为这个小小的失误值得去修改,所以就这样存在下来了。6 字段属性//序列化和反序列化时,通过该字段进行版本一致性验证 private static final long serialVersionUID = 362498820763181265L; //默认 HashMap 集合初始容量为16(必须是 2 的倍数) static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //集合的最大容量,如果通过带参构造指定的最大容量超过此数,默认还是使用此数 static final int MAXIMUM_CAPACITY = 1 << 30; //默认的填充因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; //当桶(bucket)上的结点数大于这个值时会转成红黑树(JDK1.8新增) static final int TREEIFY_THRESHOLD = 8; //当桶(bucket)上的节点数小于这个值时会转成链表(JDK1.8新增) static final int UNTREEIFY_THRESHOLD = 6; /**(JDK1.8新增) * 当集合中的容量大于这个值时,表中的桶才能进行树形化 ,否则桶内元素太多时会扩容, * 而不是树形化 为了避免进行扩容、树形化选择的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD */ static final int MIN_TREEIFY_CAPACITY = 64;/** * 初始化使用,长度总是 2的幂 */ transient Node<K,V>[] table; /** * 保存缓存的entrySet() */ transient Set<Map.Entry<K,V>> entrySet; /** * 此映射中包含的键值映射的数量。(集合存储键值对的数量) */ transient int size; /** * 跟前面ArrayList和LinkedList集合中的字段modCount一样,记录集合被修改的次数 * 主要用于迭代器中的快速失败 */ transient int modCount; /** * 调整大小的下一个大小值(容量*加载因子)。capacity * load factor */ int threshold; /** * 散列表的加载因子。 */ final float loadFactor;

 下面我们重点介绍上面几个字段:

  ①、Node<K,V>[] table

  我们说 HashMap 是由数组+链表+红黑树组成,这里的数组就是 table 字段。后面对其进行初始化长度默认是 DEFAULT_INITIAL_CAPACITY= 16。而且 JDK

本文链接地址:https://www.jiuchutong.com/zhishi/304794.html 转载请保留说明!

上一篇:php使用array_diff去除元素(php使用while循环计算1到100的和)

下一篇:VUE3 自定义 轻量级全局数据共享方案之一 Provide&inject (简单快速实现vuex功能)(vuecli怎么使用自定义组件)

  • 网络新闻营销比较好的推广方式(网络新闻营销比例是多少)

    网络新闻营销比较好的推广方式(网络新闻营销比例是多少)

  • 如何更改无线路由器名称和密码(如何更改无线路由器密码)(如何更改无线路由器信道)

    如何更改无线路由器名称和密码(如何更改无线路由器密码)(如何更改无线路由器信道)

  • 小米10支持哪些传感器(小米10支持哪些蓝牙协议)

    小米10支持哪些传感器(小米10支持哪些蓝牙协议)

  • 微信限制登录8天怎么解除(微信限制登录,不可解封怎么办)

    微信限制登录8天怎么解除(微信限制登录,不可解封怎么办)

  • 打开hd有什么弊端(打开hd有什么弊端嘛)

    打开hd有什么弊端(打开hd有什么弊端嘛)

  • 扫微信二维码会泄露个人信息吗(扫微信二维码会泄露手机上的录音吗?)

    扫微信二维码会泄露个人信息吗(扫微信二维码会泄露手机上的录音吗?)

  • potato视频加载太慢怎么办

    potato视频加载太慢怎么办

  • 微信未实名认证会封号吗(微信未实名认证为什么还可以收转账)

    微信未实名认证会封号吗(微信未实名认证为什么还可以收转账)

  • 键盘power是什么功能(电脑键盘power功能)

    键盘power是什么功能(电脑键盘power功能)

  • iphone插耳机没反应充电正常(iphone耳机插上没有声音怎么回事)

    iphone插耳机没反应充电正常(iphone耳机插上没有声音怎么回事)

  • 探探扣费后怎么申请退款(探探误操作扣款怎么申请退款)

    探探扣费后怎么申请退款(探探误操作扣款怎么申请退款)

  • 苹果手机内存升级(苹果手机内存升级256g多少钱)

    苹果手机内存升级(苹果手机内存升级256g多少钱)

  • 为什么qq扫码超时(为什么qq扫码超时不能用)

    为什么qq扫码超时(为什么qq扫码超时不能用)

  • 快手主页在哪(快手主页在哪里看访客)

    快手主页在哪(快手主页在哪里看访客)

  • ios13怎么定位别人(13系统怎么定位别人)

    ios13怎么定位别人(13系统怎么定位别人)

  • 抖音怎么取图

    抖音怎么取图

  • n9600是什么型号(n9600是国行的嘛)

    n9600是什么型号(n9600是国行的嘛)

  • 天翼看家支持多少终端(天翼看家多个摄像头)

    天翼看家支持多少终端(天翼看家多个摄像头)

  • 快手取消关注怎么恢复(快手取消关注怎么操作)

    快手取消关注怎么恢复(快手取消关注怎么操作)

  • WPS怎么转换成Word(wpspdf怎么转换成word文档)

    WPS怎么转换成Word(wpspdf怎么转换成word文档)

  • qq怎样绑定关系(在qq里怎么绑定关系)

    qq怎样绑定关系(在qq里怎么绑定关系)

  • qq勿扰模式自动回复语怎么设置(qq勿扰模式自动回复语可爱)

    qq勿扰模式自动回复语怎么设置(qq勿扰模式自动回复语可爱)

  • 小米运动如何设置语言(小米运动如何设置步数)

    小米运动如何设置语言(小米运动如何设置步数)

  • 电脑黑白色怎么调回来(电脑黑白色怎么回事)

    电脑黑白色怎么调回来(电脑黑白色怎么回事)

  • vim常用插件大全(vim8.2插件)

    vim常用插件大全(vim8.2插件)

  • 免缴车船税
  • 没有达到30万销量怎么办
  • 会计核算是否健全 填错了有影响吗
  • 资产负债表上应付账款根据什么填制
  • 预提工资与计提工资的区别
  • 专票丢失登报后怎么处理
  • 没有发票如何报账
  • 农产品增值税抵扣新政策2021
  • 减免税款的会计处理
  • 库存商品过期报废需要什么附件
  • 生产企业电梯维修方案
  • 老板垫付员工工资怎么写条子
  • 退货开负数发票的情况该如何做会计处理?
  • 增值税过期未抵扣
  • 进项税额有哪些明细科目
  • 装卸费怎么开票
  • 一般纳税人外经证预缴怎样缴费
  • 核定征收是不是不需要发票了
  • 化妆品消费税是从价还是从量
  • 企业购进货物被没收 进项税额能否抵扣?
  • 全年实现利润总额为6035
  • 工程质保金扣除
  • 怎么判断分红前已提取足够法定公积金?
  • 工程施工方安全责任
  • 商业承兑汇票是谁签发的
  • 企业所得税利润总额怎么算
  • 纳税人拒绝代扣代缴,扣缴义务人应当
  • 增值税减免税备案什么时候开始
  • 出口退税函调是什么意思
  • 政策性退税流程
  • 做胃镜多少钱了
  • 奥维尔的瓦兹河岸
  • 企业的存货采用计划成本核算,某年年末,结
  • 公司从其他公司借个钱怎么做账
  • 基于transformer的文本分类
  • react keepalive
  • 自然人税收管理系统扣缴客户端怎么操作
  • php gd
  • php使用正则表达式提取abcdef
  • vue插槽类型
  • dpkg --list
  • c语言二级指针详解
  • 利息收入做账
  • 股权转让协议受让方应注意
  • uni appp
  • 生产企业出口货物必须以什么为计税依据计算免抵退税额
  • 公司捐赠给个人公司要交税吗
  • 工厂加工外包
  • 购入原材料要交印花税吗
  • MySQL/Postgrsql 详细讲解如何用ODBC接口访问MySQL指南
  • mysql创建存储过程sql语句
  • 企业计提五险一金会计分录怎么写
  • 对增值税发票开具方面是有何要求?
  • 什么是电子银行服务
  • 开发票,对方收取税点,如何计算?
  • 本年利润的会计分录怎么写
  • 忘了作废的发票还能用吗
  • 刷信用卡的手续费一般是多少
  • 农业技术人员是什么意思
  • 工程物资属于存货还是固定资产
  • 变更法人需要什么条件
  • 债权人接受债务怎么处理
  • mysql理论知识
  • asp.net 使用SqlBulkCopy极速插入数据到 SQL Server
  • cmd 执行sql
  • freebsd使用
  • mac如何快速关闭程序
  • Windows 7 RTM、Vista、XP 性能测试
  • js基于什么语言
  • shell自定义命令
  • opengl颜色代码表
  • linux分区类型默认的是什么
  • linux创建用户的命令是什么
  • Shell脚本统计文件行数
  • unity中物体移动代码
  • javascript概述及作用
  • 如何在税务系统增加开票人员
  • 如何网上申领税票发票
  • 电子税务局申报表在哪里查询
  • 四川 国税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设