位置: 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怎么使用自定义组件)

  • procreate怎么打字(procreate怎么打字上去调整大小)

    procreate怎么打字(procreate怎么打字上去调整大小)

  • 华为水杯怎么连手机(华为水杯怎么连接)

    华为水杯怎么连手机(华为水杯怎么连接)

  • 支付宝怎么弄实体店收款码(支付宝怎么弄实时到账)

    支付宝怎么弄实体店收款码(支付宝怎么弄实时到账)

  • 老年机来电报号怎么关(老年机来电报号设置)

    老年机来电报号怎么关(老年机来电报号设置)

  • 电脑可以不装显卡吗(电脑可以不装显卡使用吗)

    电脑可以不装显卡吗(电脑可以不装显卡使用吗)

  • 苹果11视频有回音什么原因?(苹果11视频有回声怎么办)

    苹果11视频有回音什么原因?(苹果11视频有回声怎么办)

  • 苹果手机视频发烫怎么回事(苹果手机视频发不出去是怎么回事)

    苹果手机视频发烫怎么回事(苹果手机视频发不出去是怎么回事)

  • 黑色的rgb值是多少(黑色的rgb代码是什么)

    黑色的rgb值是多少(黑色的rgb代码是什么)

  • 华为手机静音闹钟会响吗(华为手机静音闹钟还会有声音吗)

    华为手机静音闹钟会响吗(华为手机静音闹钟还会有声音吗)

  • 手机拨打电话自动挂断是哪里坏了(手机拨打电话自动就挂了)

    手机拨打电话自动挂断是哪里坏了(手机拨打电话自动就挂了)

  • 检测器初始化失败是什么意思(检测器初始化失败是什么原因 中信银行手机银行)

    检测器初始化失败是什么意思(检测器初始化失败是什么原因 中信银行手机银行)

  • bn39电池是什么型号(电池bn49是什么型号的手机)

    bn39电池是什么型号(电池bn49是什么型号的手机)

  • aps画幅镜头是什么意思(aps-c画幅镜头)

    aps画幅镜头是什么意思(aps-c画幅镜头)

  • word的页面设置在哪里(word的页面设置中能够设置页边距纸张类型)

    word的页面设置在哪里(word的页面设置中能够设置页边距纸张类型)

  • 单反如何准确对焦(单反相机如何准确对焦)

    单反如何准确对焦(单反相机如何准确对焦)

  • iphone11怎么关机(iphone11怎么关机和开机)

    iphone11怎么关机(iphone11怎么关机和开机)

  • iphone8plus多重(苹果八plus手机多重)

    iphone8plus多重(苹果八plus手机多重)

  • 载波聚合开启有什么用(载波聚合的坏处)

    载波聚合开启有什么用(载波聚合的坏处)

  • 5g网络第一个城市(第一个5g行政城市)

    5g网络第一个城市(第一个5g行政城市)

  • Win10设WiFi热点时提示“无法启动承载网络”?(window10设置wifi热点)

    Win10设WiFi热点时提示“无法启动承载网络”?(window10设置wifi热点)

  • macOS 10.13允许任何来源没有了怎么办?macOS 10.13允许任何来源没了开启步骤

    macOS 10.13允许任何来源没有了怎么办?macOS 10.13允许任何来源没了开启步骤

  • 微信小程序 - 完美解决 web-view 公众号文章或第三方网站分享转发后,打开提示 “无法打开该页面,不支持打开” 或 “页面不存在”(IOS 苹果系统打开是空白页,安卓系统会有提示)超详细排查(微信小程序完美修真攻略)

    微信小程序 - 完美解决 web-view 公众号文章或第三方网站分享转发后,打开提示 “无法打开该页面,不支持打开” 或 “页面不存在”(IOS 苹果系统打开是空白页,安卓系统会有提示)超详细排查(微信小程序完美修真攻略)

  • vue3之异步组件defineAsyncComponent 使用无效?(在vue项目如何引入异步组件?)

    vue3之异步组件defineAsyncComponent 使用无效?(在vue项目如何引入异步组件?)

  • 企业清算过程中发生的费用
  • 小型微利企业的从业人数和资产总额
  • 印花税购销合同减半征收政策
  • 处置固定资产增值税税率
  • 成品油发票怎么查询
  • 收到损坏赔偿款怎么入账
  • 2018年度企业所得税税率表
  • 居民个人根据各项所得的收入 公益捐赠
  • 资本公积金转增股本是利好吗
  • 2021年旅游免费
  • 企业清算所得税申报表清算期间
  • 固定资产弃置费用计入什么科目
  • 固定资产按什么价值入账
  • 结算备付金是流水账单吗
  • 收到投资款现金流量项目是什么
  • 供电局预收电费
  • 五证一户什么意思
  • 异地仓储概述
  • 投资款缴纳印花税税目是什么
  • 物业管理体现在哪些地方
  • 个人将租来的房子转租如何交税
  • 企业出口退税款属于征收企业所得税么
  • 午餐补贴多少钱
  • 毛利润,纯利润
  • 流动资产固定资产和无形资产都是资产类账户
  • 出口货物做内销处理
  • php实现分页功能的方法
  • deepin下载教程
  • 员工奖励股权
  • 蓝牙耳机连电脑
  • 二手商铺的税费太高了吧
  • 圣三一教堂英文
  • 建筑业异地预缴增值税
  • vuejs axios
  • React - Redux Hooks的使用细节详解
  • WIN11系统CPU占用率高
  • vuejs echarts
  • 微信手续费由谁承担
  • 每个月计提折旧的分录
  • 退回的个税手续费计入什么科目
  • 合并范围外关联方是什么
  • 取得增值税
  • C语言中如何计算除法
  • 织梦手机端
  • 差旅费需要缴纳增值税吗
  • 小规模纳税人普票税率是多少
  • 个税适用税率怎么确定
  • 工作服入什么科目类别
  • 运费在会计科目中属于什么费用
  • 单位缴纳的社保计入什么科目
  • 当月已付款, 没收到发票怎么做账
  • 营业执照过期多久不能审
  • mysql子查询效率如何
  • sql提取指定字符串
  • 微软官方win10启动盘
  • windowsxp显卡驱动在哪个位置
  • windows storage server 2016下载
  • solaris 修改用户 主目录
  • mac如何强制退出微信
  • centos sudoers
  • 注册表里的默认可以删吗
  • xp系统 修复
  • Win10 Mobile 10586.63截图曝光:或为正式推送版本
  • 你会支持国产系统吗英文
  • 耳朵前皮下有个小软包
  • JavaScript数据类型分为哪两大类
  • 关于混合基金投资风险以下表述正确的是
  • javascript中循环结构包括
  • 深入解析java编译器源码剖析与实例详解pdf百度云
  • ExtJS如何设置与获取radio控件的选取状态
  • Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
  • HttpURLConnection连接 详解
  • Android游戏开发打砖块
  • Cocos2d唯一死敌的崛起,OGEngine来了
  • android textview设置字体
  • perl 文本文件处理
  • arp绑定用户直接上网是什么意思
  • unity资源包怎么用
  • android知识点大全
  • 资源税什么时候征收
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设