HashSet中add的执行过程
以如下代码来说明执行过程:
package demo;import java.util.HashSet;
import java.util.Set;public class Test {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("Tom");set.add("Tom");}
}
在正式见执行过程之前值得我们注意的是,new HashSet()代表的其实是HashMap所创建的对象,验证过程如下所示:
1.鼠标滑到add上,同时按住Ctrl键,出现如下选择,点击Open Implementtation进入
2.点击HashSet
3.鼠标滑到add上,同时按住Ctrl键,出现如下选择,点击Open Declarration
4.出现如下结果,可以清楚的知道map所代表的时HashMap()对象
除此之外还应注意的是在代码执行到第八行之前,JVM会创建一个ProcessEvironment对象,而这个对象自身会调用HashMap(),因此在执行底层代码用断点进行追踪的时候,如果提前在如下所示的位置提前设置断点的话,至少要点击60多次才会执行下一行
接下来是正式的执行过程:
1.在第九行打断点,以Debug模式运行,点击F5,出现如下所示画面
2.点击F5继续进入,出现如下所示:
3.这时在627行再打一个断点,然后点击F6,进入下一行
4.点击F6代码执行下一步,出现如下图所示的代码,这时进行代码的分析:
在存第一个Tom的时候,当代码执行到627行时我们第一次出现了table,它的默认值为null,所以此时的tab为null,因此程序会执行628行,执行的结果是,tab变成了长度为16的数组,其值为空,所以else后面的语句都不执行,代码执行完第一个Tom就存进去了
当我们添加第二个Tom的时候,我们知道Set集合里面是不允许添加重复的元素,那底层代码是如何确保添加的元素不重复呢?
我们在第二个Tom的位置打一个断点同样的方式去运行我们会发现,当执行到627行的时候,此时的tab是一个长度为16的的数组,不为空,因此会执行629行,而此时的tab[(n-1)&hash]里面的hash是相等的,因为他们的hashcode是相同的,n等于16,由此可知此时的tab[(n-1)&hash]代表上一个Tom,因此p不为空,所以会执行else后面的代码块
else后面的代码如下
if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;
当执行改行代码时,两个Tom的hash是相等的,而p.key和key分别指代的是第一个Tom和第二个Tom,他们是字符串,地址肯定是相等的,因此直接执行下一行的代码:e=p;这也证明了第二个Tom并没有存进去,因此也不会重复
HashSet中add的执行过程相关推荐
- 动图 + 源码,演示 Java 中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...
程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...
- 动图+源码,演示 Java 中常用数据结构执行过程及原理
程序员的成长之路 互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识 ...
- linux中怎么退出执行过程,(进程)处理过程中的Linux:从执行到退出
Linux是一个多任务操作系统,表面上看,同时运行许多任务--即进程.每一个进程都在系统中留下足迹.这里介绍一些检查这些足迹的工具,并且还要说明蔓延的/proc目录到底是什么. 欢迎归来.上周我们考察 ...
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- MyBatis 源码分析 - SQL 的执行过程
本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...
- mybatis delete返回值_面试:谈谈你对MyBatis执行过程之SQL执行过程理解
前言 在了解了MyBatis初始化加载过程后,我们也应该研究看看SQL执行过程是怎样执行?这样我们对于Mybatis的整个执行流程都熟悉了,在开发遇到问题也可以很快定位到问题. 更重要的,在面试中遇到 ...
- 简述计算机程序执行过程,计算机程序的执行过程
[size=small]微型计算机中程序的执行过程 计算机采取"存储程序与程序控制"的工作方式,即事先把程序加载到计算机的存储器中,当启动运行后,计算机便会自动按照程序的要示进行工 ...
- HashSet中的add()方法( 三 )(详尽版)
上接HashSet中的add()方法( 二 )(详尽版) ,前两篇说的是泛型为String类的add()方法的具体执行过程,此后三篇说说泛型为自定义类的add()方法的具体执行过程: 首先让我们来自定 ...
- HashSet中的add()方法( 一 )(详尽版)
让我们用例子来理解add()方法的底层代码吧,Let's go: import java.util.HashSet;public class Test {public static void main ...
最新文章
- 深度学习无法解决的问题,只有强化学习才能解决
- FAT16文件系统结构扇区数据分析
- android 找不到符号 符号 RequiresApi
- Linux常用命令——paste
- Leetcode初级算法(链表篇)
- Autoencoder 详解
- .NET 5 中的隐藏特性
- JSP的9个内置对象-application
- #宝塔面板# #nginx+apache# KVS服务器运行环境搭建过程记录
- 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·006【底部导航开发】
- 概率论---全概率公式和贝叶斯公式
- 错误数据(图片)去除
- ArrayList和LinkedList的异同
- 【BZOJ 4242】水壶
- TryHackMe-Gatekeeper
- 外部web端访问微信小程序云数据库的几种方法
- latex数学公式(行内(间)公式标注/希腊字母/数学函数/配对括号/定理环境
- 2008欧锦赛 球员名单 A组
- Python参考手册(第4版)pdf
- Rust 编程: 条件编译-Features