【修真院java小课堂】HashMap浅析
大家好,我是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浅析相关推荐
- 【修真院java小课堂】ArrayList浅析
大家好,我是IT修真院郑州分院第8期学员,一枚正直善良的java程序员.今天给大家分享一下,修真院官网 java任务中可能会使用到的知识点: ArrayList浅析 width="640&q ...
- 【修真院Java小课堂】Annotation注解
标题: [修真院Java小课堂]Annotation注解 开场语: 大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务七,深度思考中 ...
- 【修真院JAVA小课堂】redis缓存集群简单介绍
大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,redis缓存集群简单介绍. 1.背景介绍 redis是一个key-value存储系统.和 ...
- 【修真院java小课堂】clean,install,package,deploy分别代表什么含义?
大家好,我是IT修真院成都分院第12期学员,一枚正直善良的java程序员. 今天给大家分享一下,修真院官网java任务一中可能会使用到的知识点: clean,install,package,deplo ...
- 【修真院JAVA小课堂】什么是压测,为什么要进行压力测试?JMETER工具的使用
大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,什么是压测,为什么要进行压力测试?JMETER工具的使用. 1.背景介绍 压测,即压力测试 ...
- 【修真院Java小课堂】Tiles框架简单介绍
大家好,我是IT修真院上海分院第6期的学员,一枚正直纯洁善良的程序员 今天给大家分享一下,Tiles框架简单介绍 Tiles框架简单介绍 背景介绍 什么是Tiles Tiles 是一种JSP布局框架, ...
- 【修真院WEB小课堂】定时器有哪些用法?
这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [定时器有哪些用 ...
- 【修真院pm小课堂】详谈用户体验五要素
[修真院pm小课堂]详谈用户体验五要素 用户体验五要素在产品的工作中经常听到,那么他究竟是什么呢?怎样去使用呢? 一.战略层 明确商业目标和用户目标,解决两者之间的冲突,找到平衡点,确定产品原则和定位 ...
- 【修真院web小课堂】请描述 BFC(Block Formatting Context) 及其如何工作
请描述 BFC(Block Formatting Context) 及其如何工作 小课堂[北京-WEB-A组] 分享人:要来点本子吗 大家好,我是IT修真院北京分院第35期的学员,一枚正直.纯洁.善良 ...
- 【修真院web小课堂】angular js常用指令 ng-blur、ng-change、ng-focus、ng-disabled是如何运用到表单验证中的?
大家好,我是IT修真院武汉分院web第16期的学员孟晨,一枚正直纯洁善良的web程序员 今天给大家分享一下,修真院官网js(职业)任务八,深度思考中的知识点--angular js常用指令 ng-bl ...
最新文章
- 大头贴计算机教程,美颜相机大头贴在哪里 教你怎么弄动漫大头贴
- 自动化监控--zabbix-get安装使用详解
- 初级软件实作 - 星便笺 - 之二 - 富文本控件扩展
- Linux fedora35安装crontab定时任务工具
- CurvLearn开源 | 阿里妈妈曲率学习框架详解
- 倍福(Beckhoff)嵌入式控制器PLC
- STM32 软件重启导致死机的情况分析
- ssh远程执行oracle命令,ssh远程执行命令技巧
- 【声源定位】基于matlab单声源双麦克风房间冲激响应【含Matlab源码 547期】
- 厦门IT公司名单及联系方式
- JAVA查搜索文件内容
- 思维拓展:用java实现巧妙过桥问题
- 线程与进程的区别,举个例子让你快速理解
- 从coursera网站自动下载网课视频(Linux中bash操作)
- Ubound Lbound,数组上下边界 将二维数组处理后写入新数组,并粘贴到单元格中。
- 2019年10月19日星期六
- Windows 11 有望支持苹果 M1 Mac?微软和高通的秘密协议即将到期
- python基础入门小结(1)
- windows下安装GVM
- win10家庭版如何安装Windows Sandbox