目录
HashMap底层实现原理验证
好,那我们刚刚就已经讲到了咱们这个数据结构,也讲完了,然后呢,我们这个算法也讲完了。
那我们现在这个数据结构加上我们的算法,那我们能不能来实现咱们这个程序呢。
那你现在想不想了解一下,那我们HashMap它底层是如何去使用我们的数组和链表,以及如何去使用我们的哈希算法,
去把我们刚才这些值,去存到我们所对应的这个结构里面来。
接下来就给大家呢,去验证这个原理,这个过程就带大家去看一下 HashMap它底层是如何去实现的。来,我把这个过程给大家演示一遍。
模拟实现 put(key、hashcode、存储位置)
来看一下刚才我们这个代码,刚才我们在这里put,这几个值对吧?那现在呢,我们就去模拟一下这个put,
我现在这里呢,不用HashMap的这个put了。我当前在这里呢,我写了一个方法,写了一个put的方法。
给大家去看一下,我这个put的方法,我这个put方法呢,其实也就在这里,它非常简单,就是去输出这个key和value,
你看输出它的key和它的value以及它的哈希code,然后,这里呢,就算出这个哈希code来进行取模。如下图:
来,那么我现在给大家去运行这份代码,当我运行完成这个代码之后呢,我们就可以拿到这个key,它所对应的哈希code以及它所存储的位置,
那我们进行取模,就是我们要存储到数组里面,它的一个位置。
这就是我把这个put方法,给大家去模拟一下,那这个put方法,它到底底层是做哪些事情呢?
其实它非常简单,来我在这里呢,有一张图,就我们的put方法,
1、第一个对这个key呢,进行哈希,哈希呢就是算出它的哈希code,
2、算出它的哈希code之后呢,再进行取模,就拿到这个index,这个index其实就是数组对应的这个下标。
演示如何存储在数组
比如现在这个刘一,它的数组下标是存储位置等于4,
OK,那它就会存储到数组下标等于4这个位置。
我们刚刚讲过一个什么是幂等性,而我们算出这个哈希值等于多少,671464,
我们再次运行一次,无论我们运行多少次,它这个值都是671464,大家明不明白? 这就是幂等性,这个幂等性是一个数学上的一个概念。
好,那我们现在就把这几个位置呢,分别去存储到我们这个数组或者是我们列表,这几个位置来。
那我们现在这个数据呢,怎么去存呢?同学你们来思考一下。就是说我们现在在这里呢,我首先第一个是要去存这个刘一,
这个刘一是通过这个put的方法去存吧,通过它去存,存到数组下标等于4,那我们现在这个下标等于4,这个节点里面要存具备哪些数据呢?
当然我们讲过存储什么,是不是要存储它的key和value啊,所以我们要存两个值,那我想问一下,这一个节点下面要存两个值,那我们应该定义什么类型呢?
什么样的类型可以支持存两个值?可以存两个类型的值呢?
Map它只能存一种类型,但它可以存多个值。我们要定义Map它的这个类型是什么,如果说我们要存两个类型的值,我们可以定义为类Class,
比如Class Entry,下面可以存key和value
当然它还要存两个值,一个叫 hash(哈希值),一个叫 next 的值,那很多同学知道这个 key 和 value 要存,
但是很多同学不明白为什么要存 hash 和 next ,接下来下面这两个值,待会我会解释给你听,为什么要存这两个值?
OK,好,我们首先呢,就把这个过程给大家演示一遍,首先我们来去存刘一,它的hash值为671464,它存储位置等于4,
所以它就会存储在我们下标等于4这个位置,所以呢,我们这个下面等于4,它就等于刘一。
key为刘一,value为刘一,hash值为671464,它的next的值为空。这就是我们的刘一,通过我们这个put方法之后,
它就会存储到这个数组上面。其实说白了,一个是我们的哈希算法,一个是我们的数据结构。
好,那么我们现在已经存了刘一,之后我们再去存陈二。
这一篇文章我们讲了,如何使用哈希算法、数组存储等
下一篇文章,我们将介绍陈二以及其他值如何存储、hashmap是如何使用链表的等等