您的位置:首页 > 其它

轻松理解HashMap的底层原理,让它不再是你的绊脚石!

2020-06-09 04:46 337 查看

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中有哪些不同. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: