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

  • 相关阅读:
    Sonarqube与Angular集成
    “秘密入职”字节跳动,百度高级经理一审被判赔107万
    A-Level物理例题解析及练习Projectile Motion
    MindFusion.WinForms Pack 2022.R2
    【GD32F427开发板试用】+rtt-thread nano+finsh极简开发
    红酒识别易语言代码
    计算机毕业设计(附源码)python智慧校园系统
    超声波传感器(CHx01) 学习笔记 Ⅳ- 程序移植
    SAP Scripting Tracker基本使用技巧
    vscode输入英文时字体之间的间隔突然变大,似中文
  • 原文地址:https://blog.csdn.net/YuDBL/article/details/126425083