周末自己动手撸一个 HashMap,美滋滋

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK 文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) 阅读详情

点击上方“芋道源码”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

 

来源:张丰哲 jianshu.com/p/b638f19aeb64

  • 对HashMap的思考

  • 通过写一个迷你版的HashMap来深刻理解

    • 定义接口

    • 接口实现

    • 看MyHashMap的构造

    • Entry

    • 看put如何实现

    • hash函数

    • resize和rehash

    • get实现

    • Test测试

    • 运行结果


HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的HashMap!

对HashMap的思考

HashMap底层数据结构

第一,如图所示,HashMap有3个要素:hash函数+数组+单链表

第二,对于hash函数而言,需要考虑些什么?

要快,对于给定的Key,要能够快速计算出在数组中的index。那么什么运算够快呢?显然是位运算!

要均匀分布,要较少碰撞。说白了,我们希望通过hash函数,让数据均匀分布在数组中,不希望大量数据发生碰撞,导致链表过长。那么怎么办到呢?也是利用位运算,通过对数据的二进制的位进行移动,让hash函数得到的数据散列开来,从而减低了碰撞的概率。

如果发生了碰撞怎么办?上面的图其实已经说明了JDK的HashMap是如何处理hash冲突的,就是通过单链表解决的。那么除了这个方法,还有其他思路么?比如说,如果发生冲突,那么记下这个冲突的位置为index,然后在加上固定步长,即index+step,找到这个位置,看一下是否仍然冲突,如果继续冲突,那么按照这个思路,继续加上固定步长。其实这就是所谓的线性探测来解决Hash冲突的方法!

通过写一个迷你版的HashMap来深刻理解

定义接口

定义一个接口,对外暴露快速存取的方法。

注意MyMap接口内部定义了一个内部接口Entry。

接口实现

HashMap的要素之一,就是数组,自然在这里,我们要定义数组,数组的初始化大小,还要考虑扩容的阀值。

看MyHashMap的构造

构造方法有什么好说的呢?

仔细观察下,你会发现,其实这里使用到了“门面模式”。这里的2个构造方法其实指向的是同一个,但是对外却暴露了2个“门面”!

Entry

HashMap的要素之一,单链表的体现就在这里!

看put如何实现

第一,要考虑是否扩容?

HashMap中的Entry的数量(数组以及单链表中的所有Entry)是否达到阀值?

第二,如果扩容,意味着新生成一个Entry[],不仅如此还得重新散列。

第三,要根据Key计算出在Entry[]中的位置,定位后,如果Entry[]中的元素为null,那么可以放入其中,如果不为空,那么得遍历单链表,要么更新value,要么形成一个新的Entry“挤压”单链表!

hash函数

JDK的HashMap提供的hash函数

我这里参考了JDK的HashMap的hash函数的实现,这里也再次说明了:要想散列均匀,就得进行二进制的位运算!

resize和rehash

这里可以看出,对于HashMap而言,如果频繁进行resize/rehash操作,是会影响性能的。

resize/rehash的过程,就是数组变大,原来数组中的entry元素一个个的put到新数组的过程,需要注意的是一些状态变量的改变。

get实现

get很简单,只需要注意在遍历单链表的过程中使用== or equals来判断下即可。

Test测试

运行结果

OK,一个迷你版的HashMap就写好了,你学到了么?

周末愉快!

See u next blog!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:


最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

新四化浪潮下,中年整车诊断工程师的黄金突围路 摘要 本文探讨了汽车电子诊断工程师在当前行业变革中的独特优势与发展路径。作者作为从业者指出,整车诊断岗位在汽车"新四化"浪潮中呈现"逆生长"特性:技术壁垒高、经验复利强、市场需求持续增长。中年工程师凭借丰富的案例积累和实战经验成为行业稀缺人才,薪资水平显著高于同龄段其他技术岗位。文章分析了四条职业发展路径(技术专家、技术管理、细分深耕、横向拓展),并警示了三大职业风险(执行层局限、技术停滞、成果沉淀不足)。最后提出具体建议,强调掌握UDS高阶、DoIP以太网诊断等核心技术的重要性,为中年技术人提供了清晰的职 阅读详情

相关推荐

Zemax热分析实战:多重结构编辑器与操作数优化技巧

本文详细介绍了在Zemax中进行热分析的全流程,重点讲解了如何利用多重结构编辑器模拟不同温度环境,并通过TENP、CRVT、THIC等关键操作数建立热膨胀模型。文章结合双胶合透镜实例,阐述了如何设置热跟随、构建多温度评价函数,并运用锤型优化提升光学系统在全温度范围内的热稳定性与成像质量。

yog99的博客 576

Java手写HashMap及拓展实践

首先,我们需要定义一个HashMap类,用于存储键值对。// 实现代码在HashMap类中,我们需要定义一个数组和一个链表。// 数组// 默认数组大小V value;数组table用于存储键值对,链表Node用于解决哈希冲突。在链表中,每个节点包含一个键值对,以及指向下一个节点的指针。通过手写HashMap的实现,我们加深了对HashMap的理解,并提高了编程能力。

qq_22593423的博客 391

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3462

【数据结构与算法】手写HashMap的模拟实现

手写HashMap的模拟实现!

冲击大厂之路!!! 1841

GIS图片地理配准与边界矢量化实操指南:从原理到QGIS应用

图片数字化是GIS数据生产中的基础环节,而将扫描图纸、历史影像等栅格数据转化为可分析空间数据,离不开地理配准与边界矢量化两大核心操作。地理配准通过建立像素坐标与真实地理坐标的映射关系,配合合理分布的控制点与合适的变换模型,消除图像形变并赋予空间位置;矢量化则在此基础上将栅格边界转换为点线面要素。二者结合不仅提升数据精度,还为后续叠加分析、面积量算提供可靠基础,广泛应用于国土规划、历史地图数字化和设计图纸入库等场景。本文以QGIS为工具,系统拆解从坐标系选择、控制点采集到影像输出检查的完整配准流程,并对比自动

weixin_26834281的博客 317

20、啁啾脉冲光纤放大器:原理、设计与仿真

本文详细介绍了啁啾脉冲光纤放大器(FCPA)的原理、设计与仿真过程。内容涵盖CPA技术的基本原理、光纤基CPA系统的组成、Tm掺杂光纤放大器的工作机制、全光纤脉冲展宽器的设计以及仿真分析。通过MATLAB仿真展示了脉冲在光纤中的展宽与放大过程,并讨论了如何优化系统以减少非线性失真、控制峰值功率并提高整体性能。文章还总结了系统优化的关键策略,并展望了未来的发展方向。

v4w5x6的博客 319

手写一个HashMap

手写hashMap

ggggggzzzzz的博客 486

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

Java集合相关学习——手写一个简单的Map接口实现类(HashMap)

Java集合相关学习——手写一个简单的Map接口实现类(HashMap)

贝尔摩德苦艾酒 6678

Python控制TEMI1000/TEMI1500测试温箱

该温箱是我司从昆山振弘检测设备有限公司采购的TEMI 1000,但是控制器用的是韩国的,关于控温箱这个项目,可参考的资料仅有一份官方的manual,里面包含一些命令格式。只要你有温箱,就应该可以向厂家索取该文档。该温箱的通讯接口只有一个RS232接口,要想实现远程控制,需要有串口转USB的线;类似于下图所以,想依靠python来与之进行通信,还是要通过python 的pyserial库,关于怎么安装pyserial,过于简单,这里不做赘述,可自行百度。

xgh1951的博客 1万+

我用C#实现上位机数据一键导出Excel:从乱码到百万行数据秒级导出的实战技巧

ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("日报表");// 1. 标题(合并单元格)worksheet.Cells["A1"].Value = $"产线日报表 -DateTimeNowToString// 2. 表头和数据(同上)worksheet.Cells["A3"].Value = "时间";// ...省略表头和数据填充// 3. 合计行(公式计算)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 714

Java手写一个简单的HashMap

1.背景介绍 HashMap在Java中是常用的数据结构之一。HashMap 是一个散列表,它存储的内容是键值对(key-value)映射,并具有很快的访问速度。在JDK1.7中,HashMap是基于“数组+链表”实现的,而在JDK1.8以后,HashMap在底层实现中加入了红黑树用于提升查找速率。 图源网络,侵删 在JDK1.8中,当链表的长度大于阈值8时,这时这个链表将会转化成红黑树以提升查找效率。为什么阈值是8呢?请读者不妨思考一下这个问题,在文章末尾笔者将给出原因。(提示:想一想在红黑树和链表中

TheCalm的博客 2139

利用requests库下载bilibili字幕文件

文章目录1. 前言2. 程序下载大法好2.1 挖掘思路2.2 核心知识点2.3 汇总代码 1. 前言   之前的博客介绍了使用工具下载B站视频,但美中不足的是无法下载字幕。为了提高效率,将下载字幕的工作用程序自动化处理。 2. 程序下载大法好 2.1 挖掘思路   在谷歌浏览器中按下F12,打开谷歌开发者工具。搜索subtitle,则会得到一个json文件,如下图所示:   在网页中空白位置点击查看网页源代码,然后通过搜索(Ctrl+f)查找subtitle,则会发现在subtitle_url中包含了对应

herosunly的博客 4万+

hashmap底层原理_周末自己动手撸一个 HashMap,美滋滋

对HashMap的思考通过写一个迷你版的HashMap来深刻理解定义接口接口实现看MyHashMap的构造Entry看put如何实现hash函数resize和rehashget实现Test测试运行结果《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Sprin...

weixin_39627697的博客 137

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HashMap详解+简单手写实现(哈希表)

HashMap是Java集合框架中的一种数据结构,它实现了Map接口,用于存储键值对(Key-Value Pair)。HashMap允许null键和null值,并且不保证元素的顺序。---负载因子:0.75是时间和空间的一个平衡点,既不会浪费太多空间,也不会导致频繁扩容。

Eugene__Chen的博客 1186

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

手写简易版HashMap

前言 我们发现HashMap在jdk 1.8之后用了数组+链表+红黑树的结构,为了加深对HashMap底层设计的理解,自己也读了一些hashmap相关的源码,因此想通过手写hashmap去理其底层的操作原理。 HashMap源码解析 目标: 基于数组+链表结构实现一个HashMap,包含get()、put()、remove()方法。 环境: jdk1.8 知识储备: hashcode, 幂等性, 数组,链表,红黑树。 原理: Hash...

Dream_it_possible!的博客 2883

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

手写HashMap

基于hash算法、数组、单向链表,参考jdk中的HashMap集合,手写实现HashMap集合;基于ArrayList实现HashMap集合

weixin_47844533的博客 584

HashMap源码手写简易篇(数组+链表)

java

qq_43649937的博客 806

不怕面试再问HashMap,一次彻底地梳理(原理+手写实现)

前言朋友们又见面了,你是不是还在面试时被面试官问懵HashMap?不会手写实现一个简单HashMap?看完这篇文章你再不会算我输!提示:以下是本篇文章正文内容,案例仅供参考​编辑切换为居中添加图片注释,不超过 140 字(可选)一、HashMap介绍1.HashMap是什么?基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap类与Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺

m0_63437643的博客 386

对HashMap的思考及手写实现

前言HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的HashMap!对HashMap的思考HashMap底层数据结构 第一,如图所示,HashMap有3个要素:hash函数+数组+单链表第二,对于hash函数而言,需要考虑些什么?要快,对于给定的Key,要能够...

专注于机器学习、数据分析、软件开发、毕业设计、深度学习、Kubernetes(K8s)等多个技术领域,致力于分享实用的技术经验、开发技巧和行业最佳实践以及商务合作。 1220

手写HashMap实现

一、理解说明是哈希表,hashmap的实现原理 哈希表由数组+链表进行实现,见下图可进行说明,理解哈希表的内存模型和特点对于理解hashmap非常重要。哈希表的使用场景非常广泛,比如memcache其实就是一张非常大的哈希表。 二、重新hashmap的方法,主要理解思想 package demo.netty_lihongmin.map; /** * 抽取自己的HashM...

it_lihongmin的博客 1213

手写实现HashMap代码

了解HashMap底层=数组+链表    HashMap通过链表法来解决hash冲突 public interface DIYMap { //Map双列集合 基本功能是 快速取 public V put(K k,V v); //快速取 public V get(K k); //定义一个内部接口 public interface Entry{ public K get

Mark2When的博客 6957

HashMap彻底搞懂+手写实现

HashMap彻底搞懂+手写实现前言一、技术介绍1.HashMap是什么?二、底层原理1.数组2.链表三、单元测试总结作者寄语 提示:下方有源代码地址,请自行拿取 前言 你是不是还在面试时被面试官问懵HashMap?不会手写实现一个简单HashMap?看完这篇文章你再不会算我输! 提示:以下是本篇文章正文内容,案例仅供参考 一、技术介绍 1.HashMap是什么? 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null

后端领域、分布式、高并发、微服务、性能优化文章分享 1106

手写一个简单的HashMap

什么是HashMap? 探讨HashMap之前我们要理清楚一个概念:哈希表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 然后是HashMa

做兴趣使然的Hero 710

造轮子系列(四)手写HashMap的一个简单实现理解HashMap实现原理

该博客是根据小码哥编程《恋上数据结构与算法》及查看JDK HashMap源码所写,理解不当之处请路过滴大佬们斧正! 通过手写HashMap部分源码实现我们将知道: 哈希表原理是什么?哈希冲突如何解决?为了减少哈希冲突,HashMap中的哈希值如何计算? HashMap的底层数据结构 HashMap内部的存取逻辑 HashMap的扩容机制:装填因子是多少?扩容时是直接将元素复制过去吗? 初始化桶数组大小是多少?为什么一定是2的幂次方? 为什么要求自定义key对象时最好同时重写equals()与hashC.

m0_46550452的博客 1668

手写hashMap的简单实现

手写hashMap的简单实现 public class MyHashMap<K, V> { private static final int DEFAULT_CAPITY = 16; private static final float DEFAULT_LOAD_FACTOR = 0.75f; private Entry<K, V>[] table; private int capity; private float loadFactor;

线上幽灵 561
上一篇: IntelliJ IDEA 2019.3 发布,启动更快,性能更强
下一篇: 两万字深度介绍分布式系统原理,一文入魂
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值