HashMap是JAVA中最常见的集合类框架,也是java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的也是面试题必问之一。

我们常见的有集合数据有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点:

1、数组结构: 存储区间连续、内存占用严重、空间复杂度大
  • 优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度块)
  • 缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。
2、链表结构:存储区间离散、占用内存宽松、空间复杂度小
  • 优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活
  • 缺点:不能随机查找,每次都是从第一个开始遍历(查询和修改效率低)
3、哈希表结构:结合数组结构和链表结构的优点,从而实现了查询和修改效率高,插入和删除效率也高的一种数据结构

而我们常见的HashMap就是这样的一种数据结构

HashMap中的put()和get()的实现原理
  • 1、map.put(k,v)实现原理

(1)、首先将k,v封装到Node对象当中(节点)。
(2)、然后它的底层会调用K的hashCode()方法得出hash值。
(3)、通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。

  • 2、map.get(k)实现原理

(1)、先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
(2)、通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着参数K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。

为何随机增删、查询效率都很高的原因是?

原因: 增删是在链表上完成的,而查询只需扫描部分,则效率高。

HashMap集合的key,会先后调用两个方法,hashCode and equals方法,这这两个方法都需要重写。

为什么放在hashMap集合key部分的元素需要重写equals方法?

因为equals方法默认比较的是两个对象的内存地址

复习一波HashMap底层实现原理解析相关推荐

  1. HashMap底层实现原理--详细

    参考链接: Java集合 - (源码解析)"HashMap底层实现原理–详细" 为什么面试要问 hashmap 的原理

  2. HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理

    HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 首先HashMap是Map的一个实现类,而Map存储形式是键值对(key,value) ...

  3. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)

    HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...

  4. Java中HashMap底层实现原理

    Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析 这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap ...

  5. java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题

    目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...

  6. 聊聊Java系列-集合之HashMap底层结构原理

    前言           由于HashMap在我们的工作和面试中会经常遇到,所以搞懂HashMap的底层结构原理就显得十分有必要了.在JDK1.8之前,HashMap的底层采用的数据结构是数组+链表, ...

  7. JDK1.7中HashMap底层实现原理

    JDK1.7中HashMap底层实现原理 一.数据结构 HashMap中的数据结构是数组+单链表的组合,以键值对(key-value)的形式存储元素的,通过put()和get()方法储存和获取对象. ...

  8. HashMap红黑树原理解析

    HashMap红黑树原理解析 定义: 简单来说红黑树是一种近视平衡二叉查找树,主要优点是"平衡",即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度 ...

  9. Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析

    这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JD ...

最新文章

  1. TL-WDN3321 Ubuntu 下安装
  2. 【斗医】【13】Web应用开发20天
  3. solidity编码规范
  4. 节后的第一个周末,来领取一个Ipad吧!真香!
  5. 在 XML 中添加实体
  6. 程序员自家种水果,新鲜包邮配送!
  7. Linux内核同步机制之completion
  8. java实现winpcap_基于winpcap的ARP发送程序
  9. 用mendeley在word中插入文献_Mendeley教程-参考文献引用(论文撰写必备!)
  10. 漂亮大气!小米武汉总部正式开园:从签约到建成使用仅用时两年
  11. linux git ssh 配置文件,git bash配置ssh 登录 Linux的方法
  12. 浅谈c#中使用lock的是与非
  13. 中国开放教育资源协会
  14. vscode编写python不能查看定义_vscode开发ROS1(14)-python实现自定义消息
  15. Python多线程编程方式1(转)
  16. NLP—5.word2vec论文精读
  17. 2018-2019-2 网络对抗技术 20165115 Exp6 信息搜集与漏洞扫描
  18. 自制hdmi线一头改vga图_最全VGA、DVI、PS/2、USB等接头详解焊接方法
  19. icp matlab,ICP算法MATLAB仿真
  20. java 上传文件 md5_上传到文件选择器时的md5校验和

热门文章

  1. 关于THINKPAD X1 Carbon(6th) 卡顿问题
  2. linux笔记本无法识别显示器,为了解决笔记本外接显示器导致Ubuntu显示异常的问题,我做了这么多事情......
  3. MYSQL学习与数据库综合实验(九)——触发器
  4. MySQL Command line client窗口闪退原因
  5. 云计算的优势与未来发展趋势
  6. 华为鸿蒙2.0什么时候上市,华为鸿蒙2.0版本什么时候发布_华为鸿蒙2.0版本发布时间_3DM手游...
  7. 邻域保留投影算法(NPE)(Neighborhood Preserving Embedding)算法详解
  8. 北京公积金购买二手房攻略
  9. 使用poi复制sheet页,拷贝sheet,sheet插入行,复制行
  10. Boosting方法及代码实战