java源码系列:HashMap底层存储原理详解——6、演示1.7底层实现原理验证-如何使用哈希算法、数组存储

目录

HashMap底层实现原理验证

模拟实现 put(key、hashcode、存储位置)

演示如何存储在数组


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是如何使用链表的等等

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值