当前位置: 首页 > news >正文

HashMap源码分析 (1.基础入门) 学习笔记

本章为 《HashMap全B站最细致源码分析课程》 + 拉钩教育HashMap 学习笔记

文章目录

  • 1. HashMap的数据结构
    • 1. 数组
    • 2. 链表
    • 3. 哈希表
      • 3.1 Hash

1. HashMap的数据结构

数据结构中有数组链表来实现对数据的存储,但这两者基本上是两个极端。

1. 数组

  • 在生成数组的时候数组的长度是固定的,在增加元素时常常会遇到长度不足的问题,此时就需要进行扩容——生成一个更长的数组,并将原数组中所有元素复制到新数组中,这个过程是很消耗资源的,故插入操作比较困难。
  • 数组存储区间是连续的,占用内存严重,故空间复杂的很大。
  • 数组的二分查找时间复杂度小,为O(1);
  • 数组的特点是:寻址容易,插入和删除困难;

2. 链表

  • 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,
  • 查询时必须从头节点一个个向后查询,时间复杂度很大,达O(N)。
  • 链表的特点是:寻址困难,插入和删除容易。

3. 哈希表

  • 哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:

Hash表示意图

  • 从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。
  • HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next,从属性 key,value 我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,
  • HashMap其实也是一个线性的数组实现的,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。
  • 一般情况下存储规则为: hash(key)%len,也就是元素的key的哈希值对数组长度取模得到

3.1 Hash

  • 理论:Hash 也称散列表, 基本原理就是把任意长度的输入,通过Hash变成固定长度的输出。这个映射规则对应的就是 Hash算法,而原始数据映射后的二进制串就是哈希值

  • 特点:
  • 从 Hash值 不能反向推导出原始数据
  • 输入数据的微小变化,会得到完全不一样的hash值。相同数据的得到的hash值完全一样
  • Hash 算法执行效率高
  • Hash 算法冲突概率较小

  • 由于 Hash 的原理是将输入空间的值映射到Hash空间内, 而由于Hash空间远小于输入空间,根据抽屉原理,一定会存在不同输入空间的值映射到相同的hash空间的情况
http://www.lryc.cn/news/45113.html

相关文章:

  • 6 使用强制类型转换的注意事项
  • Leetcode.939 最小面积矩形
  • Springboot项目快速实现过滤器功能
  • 基于springboot的简历系统的实现
  • Vue3中watch的用法
  • MS python学习(18)
  • java笔记
  • 对象的构造及初始化
  • Socket 读取数据
  • 小白的Git入门教程(一)
  • 第一个Vue程序
  • 2023上学期学习计划
  • 深入了解MySQL锁机制及应用场景
  • Java类和对象
  • aspnet053+sqlserver在线考试系统xns
  • 新一代大学英语(提高篇)
  • 阿里云OSS 203 Non-Authoritative Information问题解决
  • 【数据结构】你真的认识“”吗?它真的就只是“取地址”吗?或许你一直都在误解它。
  • [深入理解SSD 21] 固态硬盘GC机制 | GC 分类 | GC 过程 | GC 和 Trim 的关系
  • 大数据未来发展怎么样?
  • 【Linux】进程和线程间的区别与联系
  • 【C语言】变量和常量
  • 蓝桥杯-卡片换位(BFS)
  • 霍夫曼编码 | 贪心算法 2
  • async 与 await
  • MYSQL语句
  • C语言函数:内存函数memcpy()以及实现
  • ArcGIS基础:栅格分区转矢量再裁剪面图层【重分类】【栅格转面】
  • vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
  • 并发编程-2