HashMap容器O(1)的查找时间复杂度只是其理想的状态,而这种理想状态需要由java设计者去保证。

在由设计者保证了链表长度尽可能短的前提下,由于利用了数组结构,使得key的查找在O(1)时间内完成。

可以将 HashMap分成两部分来看待,hash和map。map只是实现了键值对的存储。而其整个O(1)的查找复杂度很大程度上是由hash来保证的。

HashMap对hash的使用体现出一些设计哲学,如:通过key.hashCode()将普通的object对象转换为int值,从而可以将其视为数组下标,利用数组O(1)的查找性能。

OK,下面我们来看看HashMap中新增元素的时间复杂度。

put操作的流程:

第一步:key.hashcode(),时间复杂度O(1)。

第二步:找到桶以后,判断桶里是否有元素,如果没有,直接new一个entey节点插入到数组中。时间复杂度O(1)。

第三步:如果桶里有元素,并且元素个数小于6,则调用equals方法,比较是否存在相同名字的key,不存在则new一个entry插入都链表尾部。时间复杂度O(1)+O(n)=O(n)。

第四步:如果桶里有元素,并且元素个数大于6,则调用equals方法,比较是否存在相同名字的key,不存在则new一个entry插入都链表尾部。时间复杂度O(1)+O(logn)=O(logn)。红黑树查询的时间复杂度是logn。

通过上面的分析,我们可以得出结论,HashMap新增元素的时间复杂度是不固定的,可能的值有O(1)、O(logn)、O(n)。

二,hash碰撞问题

HashMap在put元素时,首先会计算key的hashcode,这时候不会去调用equals方法。为什么呢?因为equals方法的时间复杂度是O(n)。但是HashMap存在hash碰撞问题,最坏的情况下,所有的key都被分配到了同一个桶,这时map的put和get时间复杂度都是O(n)。

所以HashMap的设计者必须要考虑的一个问题就是减少hash碰撞。

HashMap解决哈希冲突采用的是哪种方式呢?

答:HashMap解决哈希冲突采用的是链地址法。说白了就是把冲突的key连接起来,放到桶里。当桶中的元素个数不超过6个时,以单链表的形式串起来,当桶中的元素个数超过6个时,以红黑树的形式串起来。

过上面的分析,我们可以得出结论,HashMap的hash操作的时间复杂度是O(1),HashMap的equals操作的时间复杂度是O(n)。

作者:鸿雁长飞鱼龙潜跃
链接:https://www.jianshu.com/p/3dbd0bf55734
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

HashMap的时间复杂度分析相关推荐

  1. 查询已有链表的hashmap_源码分析系列1:HashMap源码分析(基于JDK1.8)

    1.HashMap的底层实现图示 如上图所示: HashMap底层是由  数组+(链表)=(红黑树) 组成,每个存储在HashMap中的键值对都存放在一个Node节点之中,其中包含了Key-Value ...

  2. 源码分析系列1:HashMap源码分析(基于JDK1.8)

    1.HashMap的底层实现图示 如上图所示: HashMap底层是由  数组+(链表)+(红黑树) 组成,每个存储在HashMap中的键值对都存放在一个Node节点之中,其中包含了Key-Value ...

  3. HashMap实现原理分析

    之前转载过一篇HashMap相关分析文章,快速链接:HashMap实现原理分析 既然有前辈已经将源码分析总结了出来,我们在继续学习研究源码实现的时候不妨借鉴借鉴前人的总结与经验~ 本文转自:https ...

  4. HashMap源码分析

    文章目录 简介 继承关系 存储结构 源码分析 属性 Node节点 TreeNode HashMap 构造方法 put 添加方法 待更新 简介 在我们使用数据存储的时候都会有数据结构这种东西,但是传统的 ...

  5. HashMap的时间复杂度是O(1)

    今天在面试的时候说到HashMap,面试官问了这么一个问题:你说HashMap的get迭代了一个链表,那怎么保证HashMap的时间复杂度O(1)?链表的查找的时间复杂度又是多少? 在这之前我是阅读过 ...

  6. 硬核HashMap源码分析,HashMap文章中的圣经

    一 前言 本篇是继硬核ArrayList源码分析,答应我每天看一遍好么之后进行的第二篇源码分析:学完本篇你将对hashMap的结构和方法有个全面的了解:面试自己有多强,超人都不知道:比如HashMap ...

  7. 归并排序执行次数_归并排序过程、时间复杂度分析及改进

    前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...

  8. HashMap底层原理分析(put、get方法)

    1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...

  9. 算法时间复杂度分析基础

    摘要       本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...

最新文章

  1. centos vim配置高亮语法和格式化粘贴
  2. 表观调控高通量测序分析培训开课啦
  3. Linux常用 的命令
  4. JSP的HTML基础实验原理,实验四 JSP基础语法
  5. [转载]关于NETBIOS理清楚概念的文章
  6. android 按钮带图标 阴影_android中带图标的按钮(ImageButton)怎么用
  7. android java函数_java – 在android中创建全局函数
  8. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)(转)
  9. Nacos 新增命名空间
  10. 北京联通华为光猫HG8346R破解改桥接
  11. linux 安装 maven
  12. 基于FPGA的CameraLink视频开发案例
  13. php实现登录验证码_php如何实现登录验证码
  14. 88页《Redis学习文档》,从入门到精通,看这一篇就足够
  15. 今天开始开发竞争情报系统了,在这里做个记录
  16. 最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
  17. 班级纪念册php源码,班级纪念册内容,班级纪念册的创意设计图片内容
  18. 用Kodi访问Win10共享文件夹
  19. 星之轨迹服务器维护,10月17日例行维护公告
  20. jQuery伪类选择器

热门文章

  1. 薪资随便开、十几家猎头挖,新造车抢人有多疯狂?
  2. ISME:表层蓝藻下沉至1000米深海固氮
  3. 局域网使用kubeadm安装高可用k8s集群
  4. 01-初始化Vite项目
  5. 一次因reactor-netty bug导致springcloud gateway请求积压问题处理
  6. 如何提高 matlab 计算速度 运算效率
  7. 神器!用Python轻松搞定验证码!
  8. linux ifconfig 多地址,ifconfig查看多了几个IP地址
  9. 嵌入式设计与开发项目-DHT11温湿度传感器程序设计
  10. 从源码的角度理解Glide的执行流程