课程介绍
课程目录
用户评论
课程介绍
课程目录
用户评论

你将获得

  • HashMap 基本结构
  • HashMap 源码解析
  • 红黑树、二叉树与平衡二叉树
  • 2-3 树

教学服务

  • 名师授课,不走弯路
  • 高质量技术交流群,圈内大佬云集

讲师介绍

老师头像

高杰

Kotlin 专家、谷歌开发者社区讲师
Kotlin 专家,HenCoder 及码上开学成员之一,受邀担任谷歌开发者社区讲师。拥有丰富的 Android 开发经验,擅长 Android 组件化开发及性能优化,对布局优化、过度绘制、内存泄露等有比较深入的研究。具备丰富的大型互联网金融项目架构设计经验。

课程详情

大家都在问

想了解高级开发课

294人在问去咨询

想了解Compose

294人在问去咨询

怎么加入技术交流群?

294人在问去咨询

知识星球是什么?

294人在问去咨询

HashMap 1.7 源码解析 - 高杰视频文稿

再上一小节,我们介绍了hash map数据结构基本的存取原理,接下来我们从源码上来分析hash map,通过hashmap1.7的原码,看看hash map怎么进行初始化的存放,列表的数组是怎么创建的,还是没法再添加元素和获取元素的时候有哪些规则,除此之外,还会有上节课我们并没有谈到的一些hash map的细节,比如对key为null的处理,比如数组的扩容,然后我们这边看的是1.7的源码,首先我们有一个hash map,然后我们看看构造里面会做哪些事,我们点进去看一下,可以看到我们的空参数的构造,调用一下双参数的构造,说实话,我们Android开发在使用hash map的时候,大多数情况下用的都是这个空参构造,如果没有去看过源码,可能有的人他都不知道海选吧,还有别的构造方式,可以看到往这个双参数构造里面传入了两个参数,从变量名上可以看出来,一个是默认的初始化容积,其实也就是我们上面说到的数组的大小,还有一个是默认的负载系数,或者说是满载率,他们两个的值分别是多少呢,一个是0.75F,另外一个是把一的二进制值左移四位,也就是16,其实从这里可以看出来,Hash map在初始化的时候可以自己决定初始化数组的大小,那我们跟进到这个双参数的构造里面,代码在这里吧,从代码上可以看出来,先判断了我们传入的这个initial capacity是不是小于零,因为initial capacity表示的是数组的长度,那如果是负数,那直接就抛出异常就可以啦,接下来呢,会判断这个initial capacity是不是已经足够大了,如果已经达到了这个值,也就是一,左一三十位,也就是二的30次方,那么直接就使用这个足够大的值就可以啦,把它复制一下就可以了,再接下来我们还会继续判断我们的满载率,同样的,如果过小或者是个难值,也就是说他不是个数字,那么肯定也会有问题,所以也要抛出异常,在最后把这个满载率复制给成员变量,同时把设定的数组的初始大小复制给另外一个成员变量threshold,最后还调用了这个limit方法,那我们继续跟进到这个in each方法里面,你会发现他其实是个空方法,那他是干嘛用的呢,它是用来给子类linked hash map扩展用的,所以到这地方我们会发现,在整个hash map的构造方法当中,在我们创建一个hash map的时候,在构造方法当中,我们的素组并没有被创建出来,只是指定了一下,我们到时候会创建数组的长度,那我们的素组在哪里呢,那除了这个构造方法,我们还可以去看一下成员变量,那这个数组它对应的成员变量其实是,往上翻一下,其实是这个table,他是一个integer的数组,但是呢,这个table它的起始值是一个empty table empty table也就是一个空的数组,我们还可以看一下这个into的结构,这个key value next hash适不适合我们的图上对应起来了,那还是没把创建好了,先轮到我们的存放元素put了,在put里面做什么呢,点进去看一下,首先它会判断这个table是不是空的,如果是空的,那么需要先调用这个INF late table这个方法传入threshold,从方法名上可以看出来,在这里是要把table真正的给创建出来了,INF late table这个方法它只有四行代码,首先第一行它会调用这个run double to power of two这个方法,并且把它们传入的stretch showed再给传入进去,Run up to power to,这个方法的作用就是找出一个大于或者等于我们传入职的这个值,这个值呢,要正好是二的整数次幂,举个例子,如果全额的值是15或者是14,那比他大一点的二的整数次幂,也就是二的四次方,也就是16,而现在呢,我们全部的这个值是16,他正好是二的整数次幂,所以返回的是相同的16,从这里,不难看出来,这个capacity的值永远只会是二的整数次幂,也就是二四八十六三十二等等,得到了capacity,就会重新对这个special的进行一次赋值种植,就是后面这两个值的较小的一个值,这地方是capacity乘以note factor,也就是16乘以0.75,这里是最大的容积值,一的佐以30位,所以这种情况肯定是16乘以零点七五更小,所以这个threshold会被复制为12,那这个stretched是什么意思呢,其实这个单词翻译过来就是阈值临界值的意思,作用就是达到了这个值就会发生某些事,某些事指的是什么呢,其实就是扩容,他这里第三行代码,第三行代码会执行创建数组的操作,通过我们的capacity的值创建出来了一个新的数组,这个数组的容积是16