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方法相关推荐

  1. HashMap存储自定义类型键值: 重写HashCode和equals方法

    一个团体作为一个HashMap的key值,若团体成员的姓名年龄相同,则看作key值相同 因为是自定义类,所以需要重写HashCode和equals方法 public class RedVelvet { ...

  2. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...

    1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...

  3. HashMap存自定义对象为什么要重写 hashcode 和 equals 方法?

    HashMap的k放过自定义对象么? 当我们把自定义对象存入HashMap中时,如果不重写hashcode和equals这两个方法,会得不到预期的结果. class Key{private Integ ...

  4. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

  5. 为什么使用HashMap需要重写hashcode和equals方法_java常见面试题敲黑板了,HashMap最全的整理,大厂必考...

    最近几天,在这样的大环境下显得疲惫不堪,但是我还是写下了这篇文章,希望对任何人都有用. HashMap是我们经常用到的数据结构,由数组和链表组成的数据结构如下图所示 上方是一张数组图片,数组里面每个地 ...

  6. 为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...

    可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服,这么多约定竟然都能记得,但我不知道你是不是真的理解呢. 一.我不同时重 ...

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

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

  8. 为什么使用HashMap需要重写hashcode和equals方法_《进大厂系列》系列-HashMap

    你知道的越多,你不知道的越多 点赞再看,养成习 正文 一个婀娜多姿,穿着衬衣的小姐姐,拿着一个精致的小笔记本,径直走过来坐在我的面前. 看着眼前这个美丽的女人,心想这不会就是Java基础系列的面试官吧 ...

  9. java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)

    /*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...

最新文章

  1. jsp中九大内置对象
  2. Linux(CentOS 7)(64位)系统下安装Pymol(1.8.6)
  3. Docker(六):Docker 仓库管理与镜像加速
  4. Oracle教程之四招提高Oracle位图索引的使用效果
  5. 身体有恙,此段时间BLOG暂停更新
  6. SQL结构化查询语言中的LIKE语句
  7. M.2 固态硬盘的两种类型:SATA 和 NVMe 的区别?
  8. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
  9. SDN精华问答 | 为什么SDN要花这么长时间才被采用?
  10. ligerGrid简单例子--通过后台转数据
  11. 统计学中sp_用excel和sp和ss学统计学.doc
  12. python常见的json对象对比方法(deepdiff、json_tools、jsonpatch)
  13. 第九届蓝桥杯单片机省赛
  14. HTML CSS游戏官网网页模板——卡通的萌王游戏网页(13个页面)
  15. UICollectioView的组头和组尾的高度不同设置
  16. Salesforce收购Slack背后的原因,你知道多少?
  17. 用Vue写的一个简易的待办事项清单系统
  18. SpringBoot文件上传遇到的问题及解决方案
  19. WIN10环境下配置hadoop+spark并运行实例的教程
  20. python制作英语字典下载手机版_python如何制作英文字典

热门文章

  1. 冬天到了:你检查过你的防冻液了吗!
  2. win7 系统盘下AppData文件夹中Local和Roaming分别有什么作用?
  3. 为什么德国制造让人那么放心
  4. 关于《资产负债表》中未分配利润项目的填列
  5. abap 中的语法 div / mod 的用法区别
  6. 望城——民营经济的“旺城”
  7. pandas pivot 占比_数据处理进阶pandas入门(十八)
  8. js富文本编辑器_自制富文本编辑器
  9. python多线程处理文件_python多线程分块读取文件
  10. Swift Playgrounds Learn to Code 2 final project Pyramid