今天看了一下HashMap的源代码,除了数学Hash部分没看懂,其他基本都看懂了。
HashMap中其实主要使用一个数组来保存值的,一个对象在map中要想相等,有两个条件,第一个是它的哈希码必须相等,即在map的内部数组的桶索引必须相等,第二是它的key值也必须相等,因为map中是不允许存在key值相同的对象的。
唯一看到一个地方感觉不爽的是containsValue方法,因为这个方法是遍历整个数组来进行查找,不过本身map对value值就没有做出限制,因此这里也只能用这种方式进行查找。
还有一个比较有意思的地方时它对null key的处理,map中将所有null key放置在内部数组的index为0的位置上,当然,index为0的位置本身还可能放置其它对象。
因为null key比较特别,包括null value,所以内部有几个private方法是针对null key与null value的。
还有一个是注意它的clear函数的用法,里面清空的时候不是简单的将size置为0,而是将每个数组引用置为空,这也是以前说的实现自己的stack的时候防止内存泄露的需要注意的地方。
另外一个我觉得能从HashMap中学到的是它的构造函数的构造方式,里面提供了init方法(空实现)供子类覆盖,这就向子类提供了一个挂接的钩子,当然这个钩子是保证挂接之前map里面一些东西的初始化顺序的。实际上,很多框架的做法也是这样,很无敌。。。。
需要注意的是每个对象的hash值只要往map里面放了,就不能改变了,这从他们的定义可以看出来都是final的。
transfer函数做的无非是resize时将数组里的元素移动到另外一个新数组里,但是对象的hash值没变,变的只是对象在新数组中的位置(这个需要重新indexFor)。
其中remove和resize相关的操作其实主要就是链表的操作,只要熟练链表操作的代码,都不难看懂。
唯一比较困惑的地方是既然在同一位置的hash值一样,为什么很多比较操作比较的时候却又去比较hash值,这一点比较困惑,难道同一位置的元素hash值可能不同(原来位置的计算不是根据对象的hash来算的吗??)。
里面还有一个值得学习的地方是它的设计模式,用的真是炉火纯青啊。。。
分享到:
相关推荐
深入浅出HashMap,源码分析, HashMap存取实现,数据结构
HashMap数据结构,HashMap的构造方法,HashMap的put,HashMap的get
详解HashMap源码解析(下).doc
HashMap源码深度剖析,面试必备
面试必考之HashMap源码分析与实现....................................................................
HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx
1.面试必考之HashMap源码分析与实现 伸缩性角度看HashMap的不足
HashMap的部分源码解析
hashmap的原理啊思想。
hashmap的底层及源码解析,很适合大家的学习,不要积分。
首先,我们了解一下HashMap的底层结构历史,在JDK1.8之前采用的是数组+链表的数据结构来存储数据,是不是觉得很熟悉,没错这玩意在1.8之前的结构就和HashTable一样都是采用数组+链表,同样也是通过链地址法(这里简称...
一图解析HashMap源码流程 // 默认的HashMap中数组的长度 16 static final int DEFAULT_INITIAL_CAPACITY = 1 ; // aka 16 // HashMap中的数组的最大容量 static final int MAXIMUM_CAPACITY = 1 ; // 默认的扩容的...
c#、java、php等多语言解决方案源代码 Wafer - 快速构建具备弹性能力的微信小程序 https://github.com/tencentyun/wafer 重要: 1.第二步,可以在5分钟内实现; 2.成本3元(腾讯云支持微信小程序2017年推广期间,3...
HashMap 1.7源码分析HashMap 1.7源码分析HashMap 1.7源码分析HashMap 1.7源码分析HashMap 1.7源码分析
JAVA之hashmap源码分析 Mobile-Dev-Analysis Analysis of android or java 红岩网校工作站移动开发部学员分组学习 为了让大家学的更加坚固,采取小组学习的方式帮助大家学习,同时在学习研究的过程中需要不断的做...
JAVA之hashmap源码分析 无头Android堆分析器 “哈哈!” -纳尔逊 此存储库已弃用 创建该项目的目的是通过重新打包其他存储库中的堆转储解析器来提供堆转储解析器。 LeakCanary现在有它自己的。 该解析器在Maven ...
主要为大家详细介绍了Java集合系列之HashMap源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下