java 哈希表与HashMap
哈希表的概念
\qquad
一种新的存储方式 — 散列技术。
\qquad
散列技术是指在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每一个关键字都对应一个存储位置。即:存储位置=f(关键字)。这样,在查找的过程中,只需要通过这个对应关系f 找到给定值key的映射f(key)。只要集合中存在关键字和key相等的记录,则必在存储位置 f(key)处。我们把这种对应关系f 称为散列函数或哈希函数。
\qquad
采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为哈希表。所得的存储地址称为哈希地址或散列地址。
哈希函数
(1)哈希函数特点
\qquad
灵活:哈希函数是一个映像,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许的范围之内即可。
\qquad
冲突:要设定一个可以处理冲突的哈希函数
(2)不同情况下采用不同的哈希函数,要考虑的因素
\qquad
Hash函数 执行的时间;
\qquad
关键字 的长度;
\qquad
Hash表 的大小;
\qquad
关键字 的分布情况;
\qquad
记录 的查找频率;
(3)哈希函数的构造方法
\qquad
直接地址法
\qquad
数字分析法
\qquad
平方取中法
\qquad
折叠法
\qquad
随机数法
\qquad
除留取余法
后续方法详讲
哈希表查找步骤
\qquad
1) 存储数据时,将数据存入通过哈希函数计算所得那个地址里面。
\qquad
2) 查找时,使用同一个哈希函数通过关键字key计算出存储地址,通过该地址即可访问到查找的记录。
哈希冲突
(1)哈希冲突的定义:
\qquad
在理想的情况下,每一个 关键字,通过哈希函数计算出来的地址都是不一样的。
\qquad
在实际情况中,我们常常会碰到两个关键字 key1 ≠ key2, 但是 f(key1) = f(key2), 这种现象称为冲突,并把 key1 和 key2 称为这个散列函数的同义词。
(2)解决哈希冲突的思路
\qquad
假设哈希表的地址集为的位置上已存有记录,则“处理冲突”就是为该关键字的记录找到另一个“空”的哈希地址。在处理冲突的过程中可能得到一个地址序列为记录在表中的地址。(需要注意此定义不太适合链地址法)
(3)解决冲突的方法
\qquad
1)开放地址法
\qquad
2)再哈希法
\qquad
3)链地址法
\qquad
4)查找及分析(1.平均查找长度 2.装填因子)
Hash表和 HashMap 关系
\qquad Hash表是一种逻辑数据结构,HashMap是java中的一种数据类型(结构类型),它通过代码实现了Hash表这种数据结构,并在此结构上定义了一些列操作。
HashMap说明
\qquad HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。(其实所谓Map其实就是保存了两个对象之间的映射关系的一种集合)。
\qquad
HashMap总体结构:
说明: 说明:HashMap由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找、添加等操作很快,仅需一次寻址即可;
\qquad
如果定位到数组包含链表,对于添加操作,其时间复杂度0(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。
所以,性能考虑,HashMap中的链表出现越少,性能才会越好。