轻松理解HashMap的底层原理,让它不再是你的绊脚石!
HashMap底层原理:
1.首先,我们先回顾一下HashSet,看看它和HashMap的基本区别:
HashMap | HashSet |
实现了Map接口 | 实现了Set接口 |
存储键值对 | 存储对象 |
调用Put()向Map中添加元素 | 调用add()方法向Set中添加元素 |
HashMap使用键(Key)计算Hashcode | HashSet使用成员对象计算hashcode值,对于两个对象的hashcode值可能相同,所以用equals()方法判断对象的相等性,如果两个对象不同的话,返回false |
HashMap相对于HashSet较快,因为它是使用唯一的键获取对象 | HashSet较HashMap来说比较慢 |
2.如下就是hashMap的实现原理:
简单概述:
专业: HashMap概述: HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作,并允许使用null值和null键,此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
大白话: HashMap是Map集合的实现类,并且是线程不安全的,只要给出key,和对应的value值,就可以映射成键值对,其中key可以为null,value也可以为null,但是没有映射的顺序,也就是不保证存入map集合的顺序.
HashMap的数据结构:
在Java编程语言中(前提),最基本的结构就是两种,一个是数组,另外一个是引用,所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
HashMap 基于 Hash 算法实现的:
- 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
- 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
- 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
- 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。
提示:
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率
3.如果上面的知识,还不是太理解,可以观看一下此视频(提及源码的东西,知道就可以了,不必深究).
【Java源码精选】3分钟轻松理解HashMap原理 面试不再下饭
我在梳理一下,视频中的内容:
注意: 1).处理的是键值对 2) 随着JDK的更新,1.8的时候对底层进行了优化
注意: 1).HashMap是基于Hash表对Map实现 2).访问速度快,但是遍历顺序不确定
注意: 1) key value 都允许为null
注意:1)HashMap不是线程安全的,多个线程写操作,会破坏原子性.
注意:1)loadFactor属性是负载因子,默认值0.75;
2)threshold表示容纳键值对的临界值 计算公式 例如 默认大小16 * 负载因子0.75=12,即临界值12(也就是说超过12就扩容);
3)size 表示键值对数量;
4)modCound 表示HashMap内部结构发生变化的次数;
5)HashMap默认容量为16
注意:Jdk版本1.8
注意: 1).HashMap数组部分有个别名(哈希桶),
链表部分呢,长度大于等于8时,且数组长度>64,链表数据就换转变成红黑树存储,
长度降到6时,转成链表
注意: 1).HashMap存入Key,value的键值对,其实是一个个的node节点;
2).node节点中包含(索引位置的hash值,k键,v值,还有下一个next节点);
3).node是HashMap的内部类,实现了Map.Entry接口,本质是一个键值对;
提示:后面不理解的,在看看前面的原理
感谢您的阅读,下一篇文章会分析 HashMap在JDK1.7和JDK1.8中有哪些不同.
- 理解HashMap底层原理,一个简单的HashMap例子
- 根据hashmap理解的底层实现原理,手撸hashMap代码。hashmap源码浅析
- HashMap的底层原理的理解
- HashMap 底层实现原理,看完面试不再懵逼。
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
- 深入理解java中的底层阻塞原理及实现
- HashMap底层实现原理
- 第十三天:ArrayList的底层add方法原理,按自己理解重写了一下
- Java中HashMap底层实现原理(JDK1.8)源码分析
- 为什么你每次被问到HashMap底层原理都一知半解,这次彻底搞定它
- HashMap的源码,实现原理,底层结构
- JDK1.8源码逐字逐句带你理解HashMap底层(2)
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
- 4000 hashMap的原理 深入理解
- HashMap底层原理(3)--- 自定义HashMap中的Entry对象
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
- KVC的理解、与runtime结合应用及其底层原理
- HashMap的底层工作原理和并发问题
- HashMap底层实现原理