
深入理解HashMap原理(二)——手写HashMap
前言
前面一篇文章(深入理解HashMap原理(一)——HashMap源码解析(JDK 1.8))我们通过JDK 1.8的HashMap的源码了解了HashMap的原理。俗话说:光说不练假把式。下面我们自己动手撸一个HashMap。本文基于JDK1.7 只写数组+链表结构。
思考
我们前面知道,HashMap的存储结构为散列表,解决哈希冲突是通过链表法解决的,结构如下:
那么我们也要来实现,这个结构。
1、定义接口
我们知道HashMap是实现了Map接口的,我们也需要定义一个类似的接口,主要包括存取数据,及存储数据的结构接口(包括取键和取值)。我们定义如下:
2、自定义Map实现自定义的接口
下面我们需要实现自定义的接口,并且我们要定义默认的容量,默认加载因子(0.75),以及数组使用的长度,还有存储的数组。
HashMap的存储结构
下面我们需要实现内部接口,来自定义它每个点的存储结构,需要有键,值,及指向下一节点的对象
实现HashMap的HashCode来计算下标
我们需要自己实现HashCode来自定义确定key所对应的下标。
实现HashMap的put方法
HashMap 的put方法就是通过key确定对于数组的下标,再确定有没有哈希冲突,有则往后追加,没有则直接存放。
当然我们存储的时候还要考虑到HashMap的扩容,下面我们实现HashMap的扩容方法
实现HashMap的扩容resize
首先,我们将数组的长度乘以2,再将原来的数据重新塞到新数组中,注意这个时候存储的会变掉(因为计算下标和数组长度有关)。
实现HashMap的get方法
上面我们实现了HashMap的put方法,下面我们来实现HashMap的get方法。
总结
至此,缩减版的HashMap就实现了。最后附上github源码地址:https://github.com/Terrybthvi/MyHashMap
作者:紫雾凌寒
来源:CSDN
