散列表也叫做哈希表(hash table),这种数据结构提供了键(key)和值(value)的映射关系。只要给出一个key,就可以高效查找它匹配的value,时间复杂度接近O(1);

哈希函数

哈希函数通过某种方式,把key和数组下标进行转换。
在java中,每个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识。无论对象自身的类型是什么,他们的hashcode都是一个整型变量。
最简单的转化方式是按照数组长度进行取模运算:

index = HashCode(Key)%Array.length

JDK中的哈希函数并没有直接采取取模运算,而是利用位运算的方式来优化性能。
通过哈希函数,我们可以把字符串或其他类型的Key,转化成数组的下标index
例如长度为8的数组

key = 001121,
index = HashCode(“001121”)%Array.length=1420036703%8=7

散列表的读写扩容操作

1、写操作:在散列表中插入新的键值对
例如调用:

hashMap.put("002931","王五");

具体实现方式:
1、通过哈希函数,将key转换成数组下标,例如5
2、如果数组小标5对应的位置没有元素,就把这个键值对填充到数组下标为5的位置
但是,由于数组的长度是有限的,当插入的键值对越来越多,不同的key通过哈希函数获得的下标可能是相同的
这种情况叫做哈希冲突
例如:

002936的对应数组下标为2,;
002947的对应数组下标也是2;

哈希冲突是无法避免的。解决哈希冲突的方法:
1、开放寻址法
例如:第6组键值对通过哈希函数得到下标2,该下标在数组中已经有了其他元素,那么就向后移动1位,观察数组下标3是否有空
如果下标3也被占用,那么就再向后移动,直到找到空的位置。
(寻址的方式有很多,并不一定只是简单地寻找当前元素的后一个元素,这里只是简单举例)
2、链表法
HashMap数组的每个元素不仅是一个键值对对象,还是一个链表的头结点。每一个键值对对象通过next指针指向它的下一个键值对结点。当新来的键值对映射到与之冲突的数组位置时,只需要插入对应的链表中即可:
如下图:

2、读操作:通过给定的key,在散列表中查找对应的value
例如:调用函数hashMap.get(“002936”)
具体步骤:(以链表法为例)
1、通过哈希函数,将key转换成数组下标,例如2
2、找到数组下标2对应的元素,如果这个元素的key是002936,那么就找到了
如果这个key不是002936,由于数组的每个元素都与一个链表对应,我们可以顺着链表慢慢往下找,看看能否找到与key相匹配的结点

3、扩容操作:
当经过多次元素插入,散列表达到一定的饱和度时,key映射位置发生冲突的概率会逐渐提高。这样一来,大量元素拥挤在相同的数组下标位置形成很长的链表,对后续的插入和查询操作都会有很大影响。
此时就需要进行扩容:
影响扩容的因素:
1、HashMap当前长度
2、HashMap的负载因子,默认值为0.75f(在JDK中)
衡量HashMap需要进行扩容的操作如下:

HashMap.Size>=Capacity x LoadFactor

扩容具体步骤:
1、扩容,创建一个新的键值对空数组,长度是原数组的两倍
2、重新Hash,遍历原来的键值对数组,把所有的键值对重新Hash到新数组中(因为数组长度变化后,hash的规则也发生变化了)
经过扩容后,散列表重新变得稀疏。

【数据结构基础】【散列表】相关推荐

  1. 数据结构之散列表(七)

    前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...

  2. 数据结构四——散列表(上)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...

  3. 数据结构(55) 散列表(哈希表,hash table,hash map)

    目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...

  4. 大话数据结构:散列表

    基础介绍 是一种存储结构,就是构建一个函数,以输入的关键字作为自变量,以地址作为因变量.具体实现有很多变种. 代码 #include "stdio.h" #include &quo ...

  5. 数据结构四——散列表(下)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 7 散列表+链表的应用 很多情况下散列表会和链表一起使用.散列表可以通过key查找value.链表可以按 ...

  6. 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...

    散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...

  7. 【数据结构】散列表知识点

    散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...

  8. 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

    散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...

  9. Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现

    分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...

  10. c++数据结构:散列表(哈希)

    记录的存储位置与关键字之间存在对应关系,对应关系---hash函数 Loc(i)=H(keyi) 假设散列函数为H(key)=k 数据为:1 2 5 8 9 6 7  访问的话可以通过下标来访问数据. ...

最新文章

  1. python sqlserver api连接池_非常老的话题 SQLSERVER连接池
  2. 京东的商品搜索功能是如何实现的_【干货小知识】京东商家如何优化搜索流量?...
  3. Firefox火狐浏览器自用技巧汇总--以备使用--13.5.16
  4. iOS 支付宝支付集成获取私钥
  5. 锐浪报表数据源access_kylin+SuperSet实现实时大数据报表的快速开发
  6. Shell Scipt 命令行带参数,输出log
  7. 6个技术问题及解决方案
  8. v-html可能导致的问题
  9. 基于softmax的文本多分类模型代码实现
  10. 华为在剑桥建芯片厂;小米公布出货量反驳调研机构; 中移动否认限制号 | 极客头条...
  11. 启动项目无法打印日志处理及logback简单使用
  12. cvpr2019 文章
  13. IIS安全设置终极技巧
  14. 实现一个HTTP服务器的Demo
  15. 设计模式之适配器与外观模式(二)
  16. 中英文国际机场三字代码
  17. STM32单片机初学1-STM32介绍
  18. 牛学长iTunes备份密码移除工具
  19. 5.3 10篇美食类小红书爆文拆解【玩赚小红书】
  20. Zhong__Jenkins安装和使用

热门文章

  1. linux服务器之间文件复制命令
  2. 自定义scoll样式
  3. IIS 7.5绑定中文域名转码启动站点报“值不在预期的范围内”
  4. skype for business 无法共享桌面、无法传输图片
  5. python关于字典嵌套字典,列表嵌套字典根据值进行排序
  6. BZOJ2809 dispatching 【可并堆】
  7. 揭开Python科学计算的面纱
  8. 财务部门:你需要多长时间才能够回答老板的这些问题?
  9. (Android Studio)添加文本框
  10. 【待完善】make: command not found,以及libtool.m4 and ltmain.sh have a version mismatch问题的解决方案...