走进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 喜欢的话麻烦点下 ...
随机推荐
- 支持pc和移动端的手写签批功能
由于之前的业务需要,要求在pc端(用鼠标写字).移动端(手写)实现会签功能,然后百度下载了个签字插件,经过一些修改和功能添加,实现了现有的功能插件,效果如图: 代码下载地址:https://githu ...
- Spring EnableWebMvc vs WebMvcConfigurationSupport
EnableWebMvc vs WebMvcConfigurationSupport spring doc解释 WebMvcConfigurationSupport: This is the main ...
- poj 1113 凸包
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- Java(常用排序算法)
冒泡排序 比较相邻的元素.如果第一个比第二个大,就交换他们两个,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最 ...
- Linux主机安全配置规范
一.账号口令 1 配置口令最小长度 在文件/etc/login.defs中设置 PASS_MIN_LEN,参考值:8 2 配置口令生存周期 在文件/etc/login.defs中设置 ...
- ANSYS稳态热分析
目录 题目 APDL操作 温度云图 题目 管子内径外径为r1=4.125mm,r2=4.635mm,中间物体的产热功率为Q=8.73e8W/m3,管外有温度t=127℃的冷水流过,冷却水与管子外表面的 ...
- java 大数运算[转]
用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...
- sql语句实例练习
1.最晚入职员工查询 select * from employees where hire_date = (select max(hire_date) from employees) 2.倒数第三 ...
- 使用PROC TRANSPOSE过程步对数据集进行转置时如何保持日期变量的时间顺序
有一个数据集如下所示: 如果直接进行转置. SAS程序: proc transpose data=test out=outx1 (drop=_name_); by id; var amount; id ...
- Gradle的使用及下载
1在官网下载Gradle 基本学这个的都有JDK和JVM所以只需要在环境变量中配置即可 点击hettp://start.spring.io/即可使用