java集合听课笔记之hashMap的底层数据结构
Map
map中的key:无序,不可重复的 --》:key方法需要重写hashcode和equals方法
map中的value:无序,可重复的
一个键值对构成一个entry对象,entry对象无序不可重复
HashMap
hashmap底层的数据结构:
jdk7及之前:数组+链表
jdk8及之后:数组+链表+红黑树
JDK7为例:
实例化以后底层创建了长度为16的一维数组Entry[] table;
map.put(k1,v1);
首先,调用k1所在类的hashcode()计算k1的哈希值,此哈希值通过算法计算以后得到entry()数组所在的存放位置
如果计算得到的这个位置为空,此时的k-v(entry)直接添加成功 ----------情况一
如果此位置上的数据不为空,意味这此位置上存在着一个或多个数据(以链表形式存在),比较k1和已经存在的一个或者多个数据的哈希值
如果k1的哈希值与已经存在的数据hash值都不相同,此时k1-v1添加成功 -------情况二
如果k1的哈希值和已经存在的某个哈希值相同,调用k1所在类的equals方法,比较:
如果equals返回false,则k1-v1添加成功 ---------情况三
如果equals方法返回true,则说明key值相等,使用v1替换相同key的value值
补充:关于情况二和情况三:此时的k1-v1和原来的数据以链表的方式存储
扩容:在不断的添加过程中,会涉及到扩容问题,默认的扩容方式扩容为原来的2倍,并将原有的数据复制过来
JDK8相较JDK7不同:
1.new hashmap():底层没有马上创建长度为16的数组
2.jdk8底层的数组类型是Node类型(其实元素类型一样,名字不一样)
3.首次调用put方法时,底层才创建长度为16的数组(参考Arraylist,一样的处理方式)
4.jdk底层结构只有数组+链表,jdk8底层数据结构有数组+链表+红黑树
当数组的某一个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度>64时,此时此索引位置上的所有数据改为用红黑树存储(链表--》红黑树,红黑树查找效率高)
java集合听课笔记之hashMap的底层数据结构相关推荐
- Java集合框架之三:HashMap源码解析
Java集合框架之三:HashMap源码解析 版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集 ...
- Java 集合学习笔记:Collection
Java 集合学习笔记:Collection UML 简介 方法和说明 JDK8 新增 `default` 方法 AbstractCollection isEmpty contains(Object ...
- 【Java集合学习系列】HashMap实现原理及源码分析
HashMap特性 hashMap是基于哈希表的Map接口的非同步实现,继承自AbstractMap接口,实现了Map接口(HashTable跟HashMap很像,HashTable中的方法是线程安全 ...
- 深入Java集合学习系列:HashMap的实现原理
2019独角兽企业重金招聘Python工程师标准>>> HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和 ...
- Java集合框架笔记记录 --- 原创@余胜军 但有个人心得
Java集合框架课程安排 1.集合框架API知识 List/Set/Map集合 2.常见数据结构 数组/链表/队列/树 3.集合源码解读 List/Set/Map1.为什么需要学习Java中集合框架呢 ...
- Java 集合系列10: HashMap深入解析(2)
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 QQ群:766946816 概述 这接着上一篇的文章的内容. 第3.1部 ...
- Java 集合系列10: HashMap深入解析(1)
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 QQ群:766946816 概要 这一章,我们对HashMap进行学习. ...
- JAVA集合(笔记)
集合简介 概念:对象的容器,定义了对多个对象进项操作的的常用方法.可实现数组的功能. 和数组的区别: 数组长度固定,集合长度不固定. 数组可以存储基本类型和引用类型,集合只能存储引用类型. 位置: j ...
- Java集合- HashMap 的底层数据结构实现原理
一.HashMap 的数据结构 JDK1.8 之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列. HashMap 通过 key 的 hashCode 经过扰 ...
最新文章
- 【干货】超全!华为交换机端口vlan详解~
- Qt 多线程的简单演示
- eclipse开发android的好处,从Eclipse切换到IntelliJ IDEA for Android开发的好处
- linux搭建mq环境,Linux搭建servicemix、activemq环境
- excel公式:用countif、match、index合并同类项
- Hadoop生态圈-Hbase的API常见操作
- LAMP架构调优(六)——开启长链接
- 阅读科研文献心得分享(二)
- k8s初始化报错[kubelet-check] Initial timeout of 40s passed.
- android系统方法裁剪图片 华为手机显示为圆
- 【艾特淘】淘宝全新店铺怎么运营?从哪些方面下手?
- 电子签章,一章通用还有多远?
- Anchor-based和Anchor-free优缺点对比
- 计算机创建只读用户,如何把电脑的文件夹在局域网共享成只读,别人不能删除和修改?...
- 自学Java最起码要学到什么程度才能出去找工作?
- 对象引用、可变性和垃圾回收
- 《资讯:元宇宙》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+区块链+NFT+绿洲+头号玩家+平行宇宙+虚拟世界+Pico+Oculus+Soul+立钻哥哥++==)
- RPMsg:协议简介
- G.711 G.722 codec 搞定
- 解决页面中引用了谷歌字体库访问缓慢的问题
热门文章
- 深度学习笔记(三)—— 反向传播[Back Propagation] 计算图[Computational Graph]
- python奥运会_用python分析kaggle_奥运会数据的案例
- JSP的九大内置对象和四个作用域
- mongodb聚合联系题目及参考答案
- python 知乎 合并 pdf_实例4:用Python提取不同PDF文件中的页面合并进新的PDF文件...
- 使用CloudFormation将Docker容器自动部署到AWS
- js 数组的every() 方法
- libreoffice 出现 /lib/x86_64-linux-gnu/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordi
- 网站遭到恶意攻击有什么危害
- xp安装java_在WindowsXP中,如何安装JAVA软件?