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的更多相关文章

  1. 品HashMap(java8)

    前言 作为java开发人员,HashMap可谓是业务中的一把利器,9龙再次捡起这老生常谈的知识点,深入源码,细细品味. 首先,我们抛出几个关于HashMap的问题,带着问题去学习,就像捉迷藏一样有意思 ...

  2. 走进Java Map家族 (1) - HashMap实现原理分析

    在Java世界里,有一个古老而神秘的家族——Map.从底层架构到上层应用,他们活跃于世界的每一个角落.但是,每次出现时,他们都戴着一张冷硬的面具(接口),深深隐藏着自己的内心.所有人都认识他们,却并非 ...

  3. 走进JDK(十)------HashMap

    有人说HashMap是jdk中最难的类,重要性不用多说了,敲过代码的应该都懂,那么一起啃下这个硬骨头吧!一.哈希表在了解HashMap之前,先看看啥是哈希表,首先回顾下数组以及链表数组:采用一段连续的 ...

  4. 走进缓存的世界(三) - Memcache

    系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...

  5. 走进spring之springmvc

    走进spring之springmvc 在动手之前,我们需要了解下springnvc.这里先献上一张springmvc的流程图及讲解. Spring的MVC框架是一个基于DispatcherServle ...

  6. JDK源码分析之hashmap就这么简单理解

    一.HashMap概述 HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键.HashMap与HashTable的作用大致相同,但是它不是线程安全 ...

  7. 【java基础 13】两种方法判断hashmap中是否形成环形链表

    导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...

  8. java源码--HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素 ...

  9. 走进JavaWeb技术世界14:Mybatis入门

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

随机推荐

  1. flume实现kafka到hdfs测试用例

    kafka 到hdfs at1.sources =st1 at1.channels = ct1 at1.sinks = kt1 # For each one of the sources, the t ...

  2. 第二章代替netcat连接无响应

    按照书上的代码手打到电脑上以后,在两个终端输入了./bhnet.py -l -p 9999 -c和./bhnet.py -t localhost -p 9999之后发现没什么反映,所以又用nmap 1 ...

  3. 3. Port scanners (端口扫描器 4个)

    3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现(“ping扫描”)和端口扫描. 旧的2.x版本只有Windows,但是,新的3. ...

  4. redis key命令

    key命令主要用于管理redis中的key del key //删除key, 不存在的key会忽略 dump key //序列化key,不存在的key返回nil exists key //判断key是 ...

  5. vue 在全局设置cookie main.js文件

    //设置cookie Vue.prototype.setCookie=function(cname, cvalue, exdays) { var d = new Date(); d.setTime(d ...

  6. NodeJS 学习笔记

    1. NodeJs的事件模型被称为非阻塞式IO或者事件驱动IO 2. Node.js 几乎每一个 API 都是支持回调函数的. 3. Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现 ...

  7. miniui的联动列表

    function OnCellBeginEdit(e) { var grid = e.sender; var column = e.column; if (!column.parentfield) { ...

  8. OPUS/SILK/SPEEX 音频编码比较

    音频编码器质量表 https://blog.csdn.net/houqi1993/article/details/50504045

  9. Apache HTTP Server 与 Apache Tomcat 的区别

    要明白他们之间的区别,我们首先需要明白HTTP协议.HTML页面.JSP.Servlet之间的区别和联系. HTTP协议是在TCP/IP协议之上的应用层协议,用以在客户端和服务器之间传递信息.一般传递 ...

  10. golang操作memcached 转自https://blog.csdn.net/weixin_37696997/article/details/78760397

    go使用memcached需要第三方的驱动库,这里有一个库是memcached作者亲自实现的,代码质量效率肯定会有保障 1:安装 go get github.com/bradfitz/gomemcac ...