HashMap的实现原理简单分析

之前有一篇文章介绍了HashMap和HashTable的区别见文章《HashMap和Hashtable以及TreeMap的区别》,这里要对HashMap的内部实现原理进行简单的分析,后面也会对HashMap的源代码进行分析。

1.什么是HashMap,如何一句话把HashMap给说明白?

HashMap是一种存储着键值对(key-value)的数据结构,根据键(key)的HashCode值存储和索引数据,是一种实现了java.util.Map接口的类。

2.HashMap是一种什么类型的数据结构?

众所周知,当我们使用HashMap的时候,一方面是确实有存储一对一对应的(key-value)的需要,另外一方面是这种数据结构比较高效,增加和查找索引起来比较快。而常见的数据结构就是顺序存储结构和链式存储结构,顺序存储结构的代表就是数组,其对数据查找高效,而链式存储结构代表就是链表。HashMap考虑到数据的查找索引和数据冲突问题,使用的是数组+链表的模式。其数据结构示意图可以粗略的表示如下:


2.1HashMap数据结构中的数组部分

HashMap的数组部分其实是一个Entry类数组,Entry类是HashMap内的一个静态类,包含了四个属性变量key,value,hash和一个Entry类变量next。

当进行put操作的时候,常规思路是:首先对key进行Hash计算,然后计算得到的值找到索引位置,插入数组中。

但是如果索引位置上出现了数据,即出现了数据冲突或者叫做碰撞应该怎么做呢?这就引出了HashMap中的链表部分。

2.2HashMap数据结构中的链表部分

当出现数据冲突的时候,此时我们在某一个单一数组索引位置处加上一个链表数据结构,此时出现的冲突数据就可以加入到链表中。具体的插入按照头插法插入到链表中。

当执行get方法的时候先对key进行hash操作,然后调用equals方法,如果匹配则返回value,如果不匹配则对链表进行遍历查找,同样调用equals方法,匹配后则返回value。

2.3简单说下equals和HashCode的区别

两个变量的equals方法产生的结果相同,那么hashCode一定相同,如果不相同,那么hashCode可能相同,可能不相同。相反,hashCode相同,两个变量的equals不一定相同,两者hashCode不相同,那么equals方法一定不相同。这个在HashMap的数组+链表的数据结构中体现的淋漓尽致。

HashMap可以说道的内容特别多,我这里也是简单介绍下一些,后面讲继续完善该篇博客,并对HashMap和CurrentHashMap的源码进行分析。



猜你喜欢

转载自blog.csdn.net/horero/article/details/78833907