一:HashMap的节点:HashMap是一个集合,键值对的集合,源码中每个节点用Node<K,V>表示

static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> next;

Node是一个内部类,这里的key为键,value为值,next指向下一个元素,可以看出HashMap中的元素不是一个单纯的键值对,还包含下一个元素的引用

二:HashMap的数据结构:HashMap的数据结构为 数组+(链表或红黑树),上图:

为什么采用这种结构来存储元素呢?

数组的特点:查询效率高,插入,删除效率低

链表的特点:查询效率低,插入删除效率高

在HashMap底层使用数组加(链表或红黑树)的结构完美的解决了数组和链表的问题,使得查询和插入,删除的效率都很高。

三:HashMap存储元素的过程:

有这样一段代码:

HashMap<String,String> map = new HashMap<String,String>();
map.put("刘德华","张惠妹");
map.put("张学友","大S");

现在我要把键值对 “刘德华”,”张惠妹”存入map:

第一步:计算出键“刘德华”的hashcode,该值用来定位要将这个元素存放到数组中的什么位置.

什么是hashcode?

在Object类中有一个方法:

public native int hashCode();

该方法用native修饰,所以是一个本地方法,所谓本地方法就是非java代码,这个代码通常用c或c++写成,在java中可以去调用它。

调用这个方法会生成一个int型的整数,我们叫它哈希码,哈希码和调用它的对象地址和内容有关.

哈希码的特点是:

对于同一个对象如果没有被修改(使用equals比较返回true)那么无论何时它的hashcode值都是相同的

对于两个对象如果他们的equals返回false,那么他们的hashcode值也有可能相等

明白了hashcode我们再来看元素如何通过hashcode定位到要存储在数组的哪里,通过hashcode值和数组长度取模我们可以得到元素存储的下标。

刘德华的hashcode为20977295 数组长度为 16则要存储在数组索引为 20977295%16=1的地方

可以分两种情况:

  1. 数组索引为1的地方是空的,这种情况很简单,直接将元素放进去就好了。

  2. 已经有元素占据了索引为1的位置,这种情况下我们需要判断一下该位置的元素和当前元素是否相等,使用equals来比较。

如果使用默认的规则是比较两个对象的地址。也就是两者需要是同一个对象才相等,当然我们也可以重写equals方法来实现我们自己的比较规则最常见的是通过比较属性值来判断是否相等。

如果两者相等则直接覆盖如果不等则在原元素下面使用链表的结构存储该元素

每个元素节点都有一个next属性指向下一个节点,这里由数组结构变成了数组+链表结构,红黑树又是怎么回事呢?

因为链表中元素太多的时候会影响查找效率,所以当链表的元素个数达到8的时候使用链表存储就转变成了使用红黑树存储,原因就是红黑树是平衡二叉树,在查找性能方面比链表要高.

**四:HashMap中的两个重要的参数:**HashMap中有两个重要的参数:初始容量大小和加载因子,初始容量大小是创建时给数组分配的容量大小,默认值为16,用数组容量大小乘以加载因子得到一个值,一旦数组中存储的元素个数超过该值就会调用rehash方法将数组容量增加到原来的两倍,专业术语叫做扩容.

在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.

创建HashMap时我们可以通过合理的设置初始容量大小来达到尽量少的扩容的目的。加载因子也可以设置,但是除非特殊情况不建议设置.

HashMap的底层原理相关推荐

  1. 为什么要学习HashMap的底层原理?

    本文转载自公众号  码农翻身 上周发了一篇文章<漫画:什么是HashMap?>,引起了不少人的讨论,有一个人的留言引发了我的思考:"作为一个程序员, 真的有必要学习这些底层原理吗 ...

  2. HashMap 的底层原理

    HashMap 的底层原理 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...

  3. 为什么使用HashMap需要重写hashcode和equals方法_最通俗易懂搞定HashMap的底层原理...

    HashMap的底层原理面试必考题. 为什么面试官如此青睐这道题? HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的坎,接下来我用最通俗 ...

  4. hashMap和hashTable的区别以及HashMap的底层原理?

    hashMap和hashTable的区别? 1.继承的父类不同 HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口. 2.线程安全 ...

  5. HashMap的底层原理你真的知道?

    HashMap的底层实现原理是面试中出现频率非常高的一道面试题,本文将对HashMap的底层实现原理做一个简要的概况和总结,便于复习. 一.对于Map集合存储结构的理解 首先介绍以HashMap为典型 ...

  6. HashMap的底层原理 cr:csdn:zhangshixi

    1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...

  7. 深入浅出~HashMap的底层原理透析

    创作宗旨:化繁为简,绝不冗余,点到为止 直接开门见山,就事论事! 什么是 HashMap? HashMap类继承了父类AbstractMap<K,V>,实现了接口Map<K,V> ...

  8. HashMap面试底层原理(原作者很厉害)

    一个HashMap跟面试官扯了半个小时 前言 HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础. 开场 面试官: 你先自我介绍一下吧! 安 ...

  9. Java-Map从入门到性能分析2【HashMap的底层原理、构造方法优化、常用方法】

    [视频网址]:慕课网--Map从入门到性能分析 简介:Map是开发中,使用频率最高的知识点之一,Map家族也有很多成员,例如HashMap,LinkedMap等, 怎样更好地使用Map家族的这些成员, ...

最新文章

  1. Mybatis常用总结:参数,返回,执行sql,include等
  2. java序列化表单同步请求_Ajax serialize() 表单进行序列化方式上传文件
  3. 51nod 1379 索函数
  4. idea for循环快捷键_IDEA骚技巧,编码速度至少快一倍
  5. 【PyTorch】lr_scheduler.StepLR==>调整学习率的方法
  6. Docker学习のDocker初识
  7. LAMP的部署(一)
  8. android自动化测试--appium运行的坑问题及解决方法
  9. 25. Location hash 属性
  10. MQX4.0:MK60DZ10.h头文件GPIO模块…
  11. 吉林大学前卫南区计算机宿舍,睡过双一流学生宿舍后,把宿舍照片分享给你们,看看你们想去的学校宿舍长啥样!...
  12. C语言中cvpoint后运行出错,c++ - 使用cvCreateSeq时出现未处理的异常 - 堆栈内存溢出...
  13. Debezium报错处理系列之三十四:The db history topic or its content is fully or partially missing. Please check d
  14. 【Windows无法修复问题】“启动修复”无法修复你的电脑解决方法
  15. android仿百度新闻,【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端实现展示...
  16. python控制鼠标移动
  17. 10004 函数重载
  18. 在一黑客论坛上看见的:360免杀技术介绍
  19. OpenCV玩九宫格数独(零)——预告篇
  20. C语言计算机二级/C语言期末考试 刷题(二)

热门文章

  1. [转载] 菜鸟举例理解字节流和字符流区别
  2. Java PropertyPermission getActions()方法与示例
  3. Python程序从给定的N个数字中找到最大倍数
  4. python绘制条形图例题_python matplotlib库绘制条形图练习题
  5. python文件封装成jar_【Python】Python文件打包为可执行文件
  6. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!
  7. c#官方推荐md5通用加密类
  8. golang获取程序运行路径
  9. 服务器经常崩溃??让我们来看看简单的内存知识:C语言——内存管理
  10. BinderHub 使用简介