今天看了一下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 是 Java 中最常用的集合类之一,它是基于哈希表实现的,提供了高效的数据存取功能。HashMap 的核心原理是将键(key)通过哈希函数转化为数组...理解HashMap的内部机制对于优化代码性能和避免潜在问题非常重要。
HashMap源码深度剖析,面试必备
《HashMap 源码解析——JDK11版本》 HashMap是Java中广泛使用的非同步散列表,其设计和实现是高效且灵活的。在JDK1.8之前,HashMap的底层数据结构采用的是数组+链表的方式,这种方式称为“拉链法”来解决哈希冲突。...
1.面试必考之HashMap源码分析与实现 伸缩性角度看HashMap的不足
面试中,HashMap的源码分析与实现是一个常见的考察点,因为它涉及到数据结构、并发处理和性能优化等多个核心领域。本篇文章将深入探讨HashMap的内部工作原理、关键特性以及其在实际应用中的考量因素。 HashMap基于...
HashMap的部分源码解析
hashmap的原理啊思想。
HashMap的源码解析涉及到的数据结构主要包括数组和链表,以及在负载过大时升级为红黑树的优化策略。理解这些机制对于高效使用HashMap和解决相关问题至关重要。此外,HashMap是非线程安全的,如果在多线程环境下使用...
哈希映射(HashMap)是Java编程语言中广泛使用的数据结构之一,主要提供键值对的存储和查找功能。HashMap的实现基于哈希表的概念,它通过计算对象的哈希码来快速定位数据,从而实现了O(1)的平均时间复杂度。在深入...
在这个特定的案例中,我们有一个名为"一个delphi的hashmap源代码"的压缩包,其中包含三个不同的哈希表实现:TIntegerHashList、TStringHashList和TObjectHashList。这些类分别针对整数、字符串和对象类型的键进行了...
一图解析HashMap源码流程 // 默认的HashMap中数组的长度 16 static final int DEFAULT_INITIAL_CAPACITY = 1 ; // aka 16 // HashMap中的数组的最大容量 static final int MAXIMUM_CAPACITY = 1 ; // 默认的扩容的...
#### 二、HashMap线程安全问题分析 在多线程环境中,`HashMap`的主要线程安全问题包括但不限于: 1. **链表死循环问题**:在JDK 1.7中,当多个线程同时进行`put`操作时,可能会出现链表死循环的情况,这是一个严重...
《手写HashMap源码解析——深入理解数据结构与算法》 HashMap是Java编程语言中一个常用的集合类,它提供了一种高效、灵活的键值对存储方式。在面试过程中,尤其是2020年及以后的技术面试中,深入理解HashMap的实现...
Java集合系列之HashMap源码分析 Java集合系列之HashMap源码分析是Java集合系列中的一篇非常重要的文章,它详细介绍了Java集合系列之HashMap源码,具有很高的参考价值。下面我们将对HashMap源码进行详细的分析。 ...
c#、java、php等多语言解决方案源代码 Wafer - 快速构建具备弹性能力的微信小程序 https://github.com/tencentyun/wafer 重要: 1.第二步,可以在5分钟内实现; 2.成本3元(腾讯云支持微信小程序2017年推广期间,3...
在给定的压缩包“易语言源码易语言HashMap类源码.rar”中,包含了易语言实现的HashMap类的源代码。HashMap是一种常见的数据结构,在许多编程语言中都有实现,它提供了快速的键值对存储和查找功能。 HashMap类是基于...