走进HashMap
1、手写实现HashMap
2、解析代码并阐述HashMap1.7到1.8的变化
3、HashMap的遍历方式
4、HashMap与HashSet,Hashtable,ConcurrentHashMap 的区别
一、手写实现HashMap
接口类:
实现类:
测试类:
二、解析代码并阐述HashMap1.7到1.8的变化
1、数据结构
HashMap(1.7):数组 + 单链表
HashMap(1.8):数组 + 单链表 + 红黑树
数组:查找效率高
单链表:解决hash冲突。(单链表能解决的,就不要双链表啦~不然会需要更大的存储空间呢)
红黑树:解决链表查询深度问题,减少搜索时间(插入效率比平衡二叉树高,查询效率比普通二叉树高(存在层次较深的线性结构))
2、defaultLoader:需要扩容的加载因子,即负载因子,默认值为0.75(不建议修改)。
反映HashMap桶数组的使用情况,通过调节负载因子可以平衡HashMap时间和空间的复杂度。
负载因子高:HashMap容纳的键值对多,空间利用率高,碰撞率高,链表长,效率低
负载因子低:HashMap容纳的键值对少,扩容后(扩容条件:超过阈值(桶数组长度 * 负载因子)),碰撞少,链表短,效率高。
3、put过程:
①、对key求hash值(取模),得出数组下标值
②、如果没有碰撞,直接放入数组桶中
③、如果碰撞(hash值相同),以链表方式链接到后面(jdk1.8后,链表长度大于8转红黑树,反之,转为链表结构)
④、如果key已经存在,就覆盖旧值
⑤、如果桶满(超过阈值)就扩容重排
4、get过程:
①、对key求hash值(取模),得出数组下标值
②、hash值和键值相等时,获取值对象
5、多线程条件下:
方式一:Collections.synchronizeMap(hashMap);
方式二:使用线程安全的ConcurrentHashMap
三、HashMap的遍历方式
四、HashMap与HashSet,Hashtable,ConcurrentHashMap 的区别
hashSet:简化版的HashMap,内部实现就是HashMap(不同的key,相同的value)
ConcurrentHashMap
1、数据结构
ConcurrentHashMap(1.7):Segment数组+HashEntry数组+链表(分段锁)
ConcurrentHashMap(1.8):数组+链表+红黑树(CAS+synchronized)【结构同HashMap1.8,图参考HashMap1.8】
2、演变史
3、区别
喜欢也可关注公众号(程序媛的非程序人生)~
走进HashMap的更多相关文章
- 品HashMap(java8)
前言 作为java开发人员,HashMap可谓是业务中的一把利器,9龙再次捡起这老生常谈的知识点,深入源码,细细品味. 首先,我们抛出几个关于HashMap的问题,带着问题去学习,就像捉迷藏一样有意思 ...
- 走进Java Map家族 (1) - HashMap实现原理分析
在Java世界里,有一个古老而神秘的家族——Map.从底层架构到上层应用,他们活跃于世界的每一个角落.但是,每次出现时,他们都戴着一张冷硬的面具(接口),深深隐藏着自己的内心.所有人都认识他们,却并非 ...
- 走进JDK(十)------HashMap
有人说HashMap是jdk中最难的类,重要性不用多说了,敲过代码的应该都懂,那么一起啃下这个硬骨头吧!一.哈希表在了解HashMap之前,先看看啥是哈希表,首先回顾下数组以及链表数组:采用一段连续的 ...
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...
- 走进spring之springmvc
走进spring之springmvc 在动手之前,我们需要了解下springnvc.这里先献上一张springmvc的流程图及讲解. Spring的MVC框架是一个基于DispatcherServle ...
- JDK源码分析之hashmap就这么简单理解
一.HashMap概述 HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键.HashMap与HashTable的作用大致相同,但是它不是线程安全 ...
- 【java基础 13】两种方法判断hashmap中是否形成环形链表
导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...
- java源码--HashMap
一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素 ...
- 走进JavaWeb技术世界14:Mybatis入门
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
随机推荐
- Go语言切片
切片 Go 语言切片相当于是对数组的抽象. 由于Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比 ...
- swiper插件使用遇到的一点小问题
最近做移动端开发 给出的静态页使用了Swiper,用的是4.0.3版本,应该是比较新的. 静态页这种东西,一般就是给你个雏形,设计部虽然使用了这个插件,但毕竟这个活儿毕竟还是得开发人员来干,所以,静态 ...
- classic code review
package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSe ...
- Javascript 4.4
childNodes属性:可以从给定文档的节点树里把任何一个元素的所有子元素检索出来 返回的值是一个数组,此数组包含给定元素节点的全体子元素:element.childNodes nodeType属性 ...
- creator rotationY的问题
最近在做一个2D的小游戏,碰撞方面由于懒,就直接使用cocos自带的物理组件RigidBody了. 但是在父节点挂载RigidBody之后,会导致设置rotationY时失效,具体原因没有深查,估计是 ...
- FlexRay通信机制
通信周期是 FlexRay 的基本通信单元[6~7,19].每个通信周期包括四个时间层,如图 2-9 所示.通信周期由静态段(Static Segment).动态段(Dynamic Segment). ...
- bootstrap-daterangepicker双日历控件开始日期选择问题
在做项目的时候,有这样一个需求,需要选择时间段,于是在网上找了bootstrap的双日历时间控件daterangepicker控件,要选取时间段的年月来与后台进行数据交互,时间控件如下图所示: 关于控 ...
- CRM-展示列表,分页功能
目录 一.admin (创建超级用户) 二.展示列表 三.分页(封装成类) 一.admin (创建超级用户) 1.注册: 1.创建一个超级管理员,使用如下命令: python manage.py ...
- rsync命令简单用法介绍
rsync有两种常用的认证方式,一种为rsync-daemon方式,另外一种则是ssh.在一些场合,使用rsync-daemon方式会比较缺乏灵活性,ssh方式则成为首选.但是今天实际操作的时候发现当 ...
- devexpress gridview代码设置
39 //绑定DataTable 40 gridControl1.DataSource = dt; 41 gridView1.OptionsCustomization.AllowColumnMovin ...