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中的链表出现越少,性能才会越好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值