详解集合之HashMap——HashMap内部结构,自动扩容机制,为什么需要重写hashcode和equals方法
HashMap底层实现是一个键值对Node数组,而Node实现了键值对Map.Entry接口
HashMap类继承结构图
1. HashMap对象的创建
1.1 默认的构造方法——只指定自动扩容时的加载因子loadFactor
1.2 对初始容量或加载因子设定的构造方法
通过tableSizeFor源码分析,我们知道如果传入参数是2的次方,比如1,2,4,8...,那么最终的返回值就是本身;如果不是,那么返回的是大于参数值,且最接近参数值的2的次方。如9,返回的是16,15返回的也是16。所以我们总结tableSizeFor方法的作用就是得到大于原始值的最小的2的次方。
1.3 传入Map对象的构造方法
总结:HashMap的构造方法主要就是对threshold和loadFactor属性赋值;但是我们发现只有默认构造方法没有对threshold属性赋值,而且类中有个常量属性DEFAULT_INITIAL_CAPACITY,这里先记住,后面会有用。
2. HashMap添加元素
2.1 Map添加元素使用的是put方法,参数是key和value。内部调用putVal方法,参数是key的hash值,key,value,false,以及true,记住这些参数,后面分析putVal方法需要使用。
2.2 putVal源码分析
2.3 总结:不考虑特殊情况以及数值超界,添加元素的逻辑为:根据key的hashcode简单变形得到hash值,然后将该hash值映射到哈希表的索引。判断该索引是否为null,为null,则使用信息创建新节点;不为null则判断该索引的第一个节点是否和当前要添加节点的hash值以及==或equals相等,相等更新该节点的值即可。如果没找到则判断当前索引是否已经转为红黑树(转为树的条件是哈希表数组大小大于等于64,并且单链表节点数大于等于8),如果是红黑树,则使用红黑树的节点添加方法;如果不是,则一直比对当前节点链表,找到更新值,找不到添加至尾部。所以我们需要重写hashcode方法和equals方法,不然自带的hashcode比较的是内存地址。
3. HashMap通过key获取元素
4. HashMap其它常用方法
4.1 keySet和values方法得到key集合和value集合,keySet和values是内部属性。
4.2 remove方法移除某元素——先寻找再移除
4.3 clear方法清空
4.4 containsKey方法判断是否包含key
4.5 containsValue方法判断哈希表是否包含某个value,很费时间,少用。
5. HashSet。
5.1 HashSet构造方法内部实际使用HashMap对象。
5.2 数据存储时,只记录key,不记录value而已,value使用内部的一个Object类型常量PRESENT。
详解集合之HashMap——HashMap内部结构,自动扩容机制,为什么需要重写hashcode和equals方法相关推荐
- HashMap存储自定义类型键值: 重写HashCode和equals方法
一个团体作为一个HashMap的key值,若团体成员的姓名年龄相同,则看作key值相同 因为是自定义类,所以需要重写HashCode和equals方法 public class RedVelvet { ...
- 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...
1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...
- HashMap存自定义对象为什么要重写 hashcode 和 equals 方法?
HashMap的k放过自定义对象么? 当我们把自定义对象存入HashMap中时,如果不重写hashcode和equals这两个方法,会得不到预期的结果. class Key{private Integ ...
- 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...
我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...
- 为什么使用HashMap需要重写hashcode和equals方法_java常见面试题敲黑板了,HashMap最全的整理,大厂必考...
最近几天,在这样的大环境下显得疲惫不堪,但是我还是写下了这篇文章,希望对任何人都有用. HashMap是我们经常用到的数据结构,由数组和链表组成的数据结构如下图所示 上方是一张数组图片,数组里面每个地 ...
- 为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...
可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服,这么多约定竟然都能记得,但我不知道你是不是真的理解呢. 一.我不同时重 ...
- 为什么使用HashMap需要重写hashcode和equals方法_最通俗易懂搞定HashMap的底层原理...
HashMap的底层原理面试必考题. 为什么面试官如此青睐这道题? HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的坎,接下来我用最通俗 ...
- 为什么使用HashMap需要重写hashcode和equals方法_《进大厂系列》系列-HashMap
你知道的越多,你不知道的越多 点赞再看,养成习 正文 一个婀娜多姿,穿着衬衣的小姐姐,拿着一个精致的小笔记本,径直走过来坐在我的面前. 看着眼前这个美丽的女人,心想这不会就是Java基础系列的面试官吧 ...
- java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...
最新文章
- jsp中九大内置对象
- Linux(CentOS 7)(64位)系统下安装Pymol(1.8.6)
- Docker(六):Docker 仓库管理与镜像加速
- Oracle教程之四招提高Oracle位图索引的使用效果
- 身体有恙,此段时间BLOG暂停更新
- SQL结构化查询语言中的LIKE语句
- M.2 固态硬盘的两种类型:SATA 和 NVMe 的区别?
- 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
- SDN精华问答 | 为什么SDN要花这么长时间才被采用?
- ligerGrid简单例子--通过后台转数据
- 统计学中sp_用excel和sp和ss学统计学.doc
- python常见的json对象对比方法(deepdiff、json_tools、jsonpatch)
- 第九届蓝桥杯单片机省赛
- HTML CSS游戏官网网页模板——卡通的萌王游戏网页(13个页面)
- UICollectioView的组头和组尾的高度不同设置
- Salesforce收购Slack背后的原因,你知道多少?
- 用Vue写的一个简易的待办事项清单系统
- SpringBoot文件上传遇到的问题及解决方案
- WIN10环境下配置hadoop+spark并运行实例的教程
- python制作英语字典下载手机版_python如何制作英文字典
热门文章
- 冬天到了:你检查过你的防冻液了吗!
- win7 系统盘下AppData文件夹中Local和Roaming分别有什么作用?
- 为什么德国制造让人那么放心
- 关于《资产负债表》中未分配利润项目的填列
- abap 中的语法 div / mod 的用法区别
- 望城——民营经济的“旺城”
- pandas pivot 占比_数据处理进阶pandas入门(十八)
- js富文本编辑器_自制富文本编辑器
- python多线程处理文件_python多线程分块读取文件
- Swift Playgrounds Learn to Code 2 final project Pyramid