大家好,我是IT修真院郑州分院第十期的学员,一枚正直纯洁善良的java程序员

今天给大家分享一下,修真院官网java任务十,深度思考中的知识点——HashMap浅析。

背景介绍

Map集合即K-V集合,加上一个hash,这样是散列、无序的。HashMap简单理解就是散列、无序的K-V集合,接下来深入解析一下HashMap。

知识剖析

HashMap的数据结构

数组的优缺点:通过下标索引方便查找,但是在数组中插入或删除一个元素比较困难。

链表的优缺点:由于在链表中查找一个元素需要以遍历链表的方式去查找,而插入,删除快速。因此链表适合快速插入和删除的场景,不利于查找。

HashMap的底层是哈希数组,数组元素为Entry。HashMap通过key的hashCode来计算hash值,当hashCode相同时,通过“拉链法”解决冲突。

HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要重建该哈希表内部数据结构,从而哈希表将具有大约两倍的桶数。

通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少重构操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生重构操作。

常见问题

为什么HashMap的数组长度一定是2的次幂?

扩展思考

Jdk1.7和1.8中hashMap的区别

数据结构引入了红黑树,解决链表过长时增删改查效率过低的问题;

扩容后存储位置的计算不同,jdk1.7在扩容后,key需要按照原来的方法重新计算一次。1.8里,直接原位置或者原位置+扩容量;

插入数据的方法也不同,1.7使用的是头插法,1.8使用尾插法。

参考文献

https://blog.csdn.net/soga613/article/details/78958642

https://blog.csdn.net/liyantianmin/article/details/79401854

https://www.cnblogs.com/chengxiao/p/6059914.html

更多讨论

Q1:hashmap 超过默认长度扩容时,是重新创建hashmap(包括定义长度)然后将原来的内容复制过来,然后销毁原来的hashmap?

A1:对,因为数组这种数据结构只能重新申请内存空间,无法直接扩容。

Q2:HashMap什么时候进行扩容?

A2:根据负载因子计算,当前使用的的容量大于负载因子和最大容量的乘积时,进行扩容。

Q3:随着数据量的增加,hashMap的查询时间复杂度?

A3:数组时是O(1),链表时是O(log n),链表长度超过8个变为红黑树,是O(n)。

【修真院java小课堂】HashMap浅析相关推荐

  1. 【修真院java小课堂】ArrayList浅析

    大家好,我是IT修真院郑州分院第8期学员,一枚正直善良的java程序员.今天给大家分享一下,修真院官网 java任务中可能会使用到的知识点: ArrayList浅析 width="640&q ...

  2. 【修真院Java小课堂】Annotation注解

    标题: [修真院Java小课堂]Annotation注解 开场语: 大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务七,深度思考中 ...

  3. 【修真院JAVA小课堂】redis缓存集群简单介绍

    大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,redis缓存集群简单介绍. 1.背景介绍 redis是一个key-value存储系统.和 ...

  4. 【修真院java小课堂】clean,install,package,deploy分别代表什么含义?

    大家好,我是IT修真院成都分院第12期学员,一枚正直善良的java程序员. 今天给大家分享一下,修真院官网java任务一中可能会使用到的知识点: clean,install,package,deplo ...

  5. 【修真院JAVA小课堂】什么是压测,为什么要进行压力测试?JMETER工具的使用

    大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,什么是压测,为什么要进行压力测试?JMETER工具的使用. 1.背景介绍 压测,即压力测试 ...

  6. 【修真院Java小课堂】Tiles框架简单介绍

    大家好,我是IT修真院上海分院第6期的学员,一枚正直纯洁善良的程序员 今天给大家分享一下,Tiles框架简单介绍 Tiles框架简单介绍 背景介绍 什么是Tiles Tiles 是一种JSP布局框架, ...

  7. 【修真院WEB小课堂】定时器有哪些用法?

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [定时器有哪些用 ...

  8. 【修真院pm小课堂】详谈用户体验五要素

    [修真院pm小课堂]详谈用户体验五要素 用户体验五要素在产品的工作中经常听到,那么他究竟是什么呢?怎样去使用呢? 一.战略层 明确商业目标和用户目标,解决两者之间的冲突,找到平衡点,确定产品原则和定位 ...

  9. 【修真院web小课堂】请描述 BFC(Block Formatting Context) 及其如何工作

    请描述 BFC(Block Formatting Context) 及其如何工作 小课堂[北京-WEB-A组] 分享人:要来点本子吗 大家好,我是IT修真院北京分院第35期的学员,一枚正直.纯洁.善良 ...

  10. 【修真院web小课堂】angular js常用指令 ng-blur、ng-change、ng-focus、ng-disabled是如何运用到表单验证中的?

    大家好,我是IT修真院武汉分院web第16期的学员孟晨,一枚正直纯洁善良的web程序员 今天给大家分享一下,修真院官网js(职业)任务八,深度思考中的知识点--angular js常用指令 ng-bl ...

最新文章

  1. 大头贴计算机教程,美颜相机大头贴在哪里 教你怎么弄动漫大头贴
  2. 自动化监控--zabbix-get安装使用详解
  3. 初级软件实作 - 星便笺 - 之二 - 富文本控件扩展
  4. Linux fedora35安装crontab定时任务工具
  5. CurvLearn开源 | 阿里妈妈曲率学习框架详解
  6. 倍福(Beckhoff)嵌入式控制器PLC
  7. STM32 软件重启导致死机的情况分析
  8. ssh远程执行oracle命令,ssh远程执行命令技巧
  9. 【声源定位】基于matlab单声源双麦克风房间冲激响应【含Matlab源码 547期】
  10. 厦门IT公司名单及联系方式
  11. JAVA查搜索文件内容
  12. 思维拓展:用java实现巧妙过桥问题
  13. 线程与进程的区别,举个例子让你快速理解
  14. 从coursera网站自动下载网课视频(Linux中bash操作)
  15. Ubound Lbound,数组上下边界 将二维数组处理后写入新数组,并粘贴到单元格中。
  16. 2019年10月19日星期六
  17. Windows 11 有望支持苹果 M1 Mac?微软和高通的秘密协议即将到期
  18. python基础入门小结(1)
  19. windows下安装GVM
  20. win10家庭版如何安装Windows Sandbox

热门文章

  1. 植物大战僵尸修改存档文件-C1认证
  2. 用极大似然法估计因子载荷矩阵_[转载]第三十六课         因子分析
  3. 生产者消费者的几种写法
  4. Mac finder 文件剪切方法 怎么剪切/移动 剪切快捷键
  5. gateway自定义负载均衡策略
  6. 滴滴开源基于金融场景的Vuejs组件库Mand Mobile
  7. python取消任务的方法_对Python定时任务的启动和停止方法详解
  8. 谈谈DRAM的检测等级(eTT与uTT)
  9. 《经济学通识》十一、企业该不该有钱、慈善
  10. leetcode 每日一题 一起进步714 买卖股票的最佳时机含手续费