什么是数据结构

在计算机中,数据存储于内存之中,而决定了数据在内存中存放的顺序以及位置关系的就是数据结构。可以将他看作是一种对数据的存放的一种规定。

什么是哈希表

哈希表又叫散列表,是一个支持快速随机访问的数据结构,数组的一种变形。
image.png
如上图所示,哈希表存储数据采用键值对的方式,也就是key-value的形式存储数据。

哈希表与数组的区别:

背景:现在有六个人的性别需要存储,M为男,F为女

  • 问题:想要查询Ally的性别
    我们先用一个数组来存储该数据
    image.png
    由于我们不知道Ally在数组的哪个位置,那么我们只能挨个去查找Ally的数据存储在哪,这个挨个查找的行为叫做线性查找
    从下标 0 开始查找,发现下标 0 存储的键是 Joe 而不是 Ally,因此接着查找下标 1 。
    image.png
    下标 1 中也不是Ally,于是继续往下查找
    image.png
    一直查找下去,直到下标 4 时才查找到Ally,从而知道她的性别为F(女)。

通过上面演示的查找过程,我们不难发现,当数据量越来越大,线性查找所耗费的时间也就越长,此时我们需要一个更加高效的数据结构来存储上面的数据

使用哈希表来存储该数据。
首先我们准备好数组,这次的数组长度为5。
image.png
先将Joe存储进去,通过哈希函数(hash)计算Joe的键,也就是字符串Joe的hash值,比如此时得到结果 4928.
image.png
将得到的哈希值除以数组的长度 5,求得其余数,这样的求余运算叫作取模运算(mod运算),此处mod运算的结果为3。于是,我们将Joe的数据存储到下标 3 所在的空间。
image.png
重复上面的操作,将剩下的数据存储到数组中。
image.png
此时,Nell的哈希值经过取模运算后,, mod的值为1,但下标为 1 的空间已经存储了Sue的信息,这是什么情况呢?这种存储位置冲突了或者说重复了的现象叫做哈希冲突
遇到这种情况,可以采用链表在已有的数据后面继续存储新的数据,之前的数据的下一个节点指向这个新数据所在的空间。(链表法)
最后,我们得到一个这样的数据存储结构,这就是哈希表:
image.png

那么这个时候,我们想要得到Ally的性别,如何进行查询呢?
将Ally进行哈希运算后再进行取模运算,得到结果3
image.png
但是下标 3 的空间里存储的是Joe,此时我们就需要对Joe所在的链表进行线性查找,于是得到了Ally的性别F(女)
image.png

总结

哈希表也叫散列表,来源于数组,它借助哈希函数对数组这种数据结构进行扩展, 利用的是数组支持按下标随机访问元素的特性,是存储Key-Value映射的集合。

Java中如何实现哈希表,可以看博主的另一篇博客:[Java容器]HashMap源码解析

参考资料:
https://www.cnblogs.com/wupeixuan/p/12319785.html