首页 > 编程语言 >[javase高级] HashMap实现原理

[javase高级] HashMap实现原理

时间:2023-08-25 14:37:20浏览次数:35  
标签:key hash HashMap 高级 链表 键值 数组 javase

HashMap是数组+链表实现的,既然用到hash散列,那么肯定不可避免的会出现冲突问题,HashMap解决冲突的方法是拉链法,因为这里有用到数组,那么当容量不足的时候就需要进行扩容操作了,在HashMap中有个术语叫冲突,当冲突几率越来越高的时候就需要进行扩容操作了

那什么情况就叫冲突几率高呢?就是当我们的数组元素个数超过了数组原先大小*装填因子,默认情况下的装填因子是0.75,扩容有个坏处就是每次扩容之后都必须重新计算原先数组中的元素在新数组中的存储位置,这点比较消耗性能,所以一般情况下如果你已经能够确定最大需要多大散列范围的数组的话,建议还是能够指定大小;

put操作和set操作进行操作的对象是主要是key,如果你查看源码的话会发现value只是跟着key的步伐在走而已,并没有实质性的进行操作,对于put操作,首先会计算出当前key对应的hash值,接着找到计算出来的hash值在数组中的下标位置,查看该下标位置处对应的链表是否为null,为空的话直接将当前键值对插入到该链表首位,不会执行当前key对象的equals方法;

如果下标位置处对应的链表不为null的话,会通过for循环来通过key的equals方法来查看这个链表中有没有与当前键值相等的键值对Entry存在,有的话,会用当前值替换原先这个键值对的value值,遍历结束如果不存在的话,会将当前键值对插入到链表的头部,这个就是put过程了;

get操作过程思想可以借助于put过程,首先会计算出当前key值的hash值,接着找到此hash值在数组中的位置,找到这个位置对应的链表,接着通过for循环遍历这个链表,遍历过程中调用equals方法查看有没有等于当前key的键值对存在,有的话直接返回这个键值对对应的value值即可;

HashMap注意点:

1、 HashMap是非线程安全的,也就是说你在使用迭代器的过程中有其他线程修改了map的话,你的程序可能会抛出ConcurrentModificationException异常,这就是我们常见的fail-fast机制了,原因在于我们在调用HashMap的迭代器里面的每个方法的时候,都会通过判断原先map被修改次数和当前被修改次数是否相等,不等的话直接就抛出了ConcurrentModificationException异常了,这点在ArrayList里面使用迭代器也会出现,具体解决方法就是使用ConcurrentHashMap代替HashMap了;

2、HashMap是允许你的键或者值为null的;

3、HashMap是不能保证随着时间的推移,你里面元素之间的顺序不变,原因就在于map中存放hash值的数组在扩容的时候会重新计算原先元素在新数组中位置的

标签:key,hash,HashMap,高级,链表,键值,数组,javase
From: https://www.cnblogs.com/w1366/p/17656823.html

相关文章

  • Android并发编程高级面试题汇总(含详细解析 九)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • 说一下 HashMap 的实现原理?
    HashMap是Java集合框架中的一个重要类,用于存储键值对。它的实现基于哈希表(HashTable)数据结构,其基本原理是通过将键映射到一个索引,然后在该索引位置存储对应的值。以下是HashMap的主要实现原理:哈希函数:当你向HashMap中添加键值对时,首先会将键通过哈希函数转换成一个整数,该......
  • JavaSE(2)(简单了解idea, 项目结构,运算符,数据转换,原反补码)
    JavaSE(2)(简单了解idea,项目结构,运算符,数据转换,原反补码)p28idea项目结构project项目 > module模块 > package包 > class类拿微信举例,微信就是项目,它下方的四大功能(微信,通讯录,发现,我)就是模块,一个项目是包含一个或多个模块的.以第一个微信模块为例,我们......
  • PPT一键导入秒变视频?你没听错!有了这个神器,让你的PPT从基础到高级,转化为视频就像变魔术
    我们都知道PPT是一个绝对实用的工具,可以帮助我们展示演讲、产品介绍、项目计划等等。但是有时候,我们想把PPT变成视频的形式,这样更容易传播和分享啦!   那么你会制作PPT吗?你在使用中有遇到过一些困难吗?让我给你看看我身边几位朋友对PPT的感受吧! 企业朋友A说:......
  • c# .NET 高级编程 高并发必备技巧(二) - 分布式锁
    上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问题。然而现实中,一般会高并发的应用,很少会单机部署。当用户量达到一定的程度,分布式、集群部署是必然的选择。在分布式部署的情况下,之前的单机锁还会有效吗?代码还是之前的代码:privatestaticobjectlck=......
  • openGauss学习笔记-48 openGauss 高级数据管理-函数
    openGauss学习笔记-48openGauss高级数据管理-函数openGauss常用的函数如下:48.1数学函数abs(x)描述:绝对值。返回值类型:和输入相同。示例:openGauss=#SELECTabs(-17.4);abs------17.4(1row)cbrt(dp)描述:立方根。返回值类型:doubleprecision示例:openGauss......
  • 高级Android组件化、插件化强化实战,附大厂源码解析
    前言当今移动应用市场竞争激烈,为了在激烈的竞争中脱颖而出,开发人员需要不断提高应用性能,从而提高用户体验。而Android组件化和插件化技术则为优化性能提供了更好的方法。什么是组件化组件化技术是将一个大型的Android应用拆分成多个小模块或组件,每个组件负责不同的功能,通过组合不同......
  • 探索有效的SEO优化策略:从基础到高级
    导言:在当今数字化时代,搜索引擎优化(SEO)是使网站脱颖而出、吸引流量并提升在线业务的关键。本文将深入探讨SEO的基本原理和高级策略,帮助您在竞争激烈的互联网中脱颖而出。一、SEO基础知识关键词研究: 通过研究目标受众的搜索习惯,找到与您业务相关的高搜索量关键词。内容优化: ......
  • 配置Postern和ProxyCap实现更高级的功能
    寻找更高级的代理功能,让你实现更多可能性?那就来了解一下Postern和ProxyCap吧!本文将为你详细介绍这两款工具的配置方法和使用技巧,助你轻松完成代理设置,畅享更广阔的网络世界。一、什么是Postern和ProxyCap?Postern和ProxyCap是两款强大的代理工具,它们可以帮助你实现更高级的代理功能......
  • 高级 Synth
    高级Synth有了最新的Swing外观,定制UI不在话下级别:初级MichaelAbernethy2005年2月01日本文将深入透视Synth外观,它是Java5.0中为Swing引入的最新内容。通过为JavaUI编程引入“皮肤”的概念,Synth使开发人员可以为应用程序创建和部署定制的外观。软件工......