以如下代码来说明执行过程:

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的执行过程相关推荐

  1. 动图 + 源码,演示 Java 中常用数据结构执行过程及原理

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  2. 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...

    程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...

  3. 动图+源码,演示 Java 中常用数据结构执行过程及原理

    程序员的成长之路 互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识 ...

  4. linux中怎么退出执行过程,(进程)处理过程中的Linux:从执行到退出

    Linux是一个多任务操作系统,表面上看,同时运行许多任务--即进程.每一个进程都在系统中留下足迹.这里介绍一些检查这些足迹的工具,并且还要说明蔓延的/proc目录到底是什么. 欢迎归来.上周我们考察 ...

  5. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  6. MyBatis 源码分析 - SQL 的执行过程

    本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...

  7. mybatis delete返回值_面试:谈谈你对MyBatis执行过程之SQL执行过程理解

    前言 在了解了MyBatis初始化加载过程后,我们也应该研究看看SQL执行过程是怎样执行?这样我们对于Mybatis的整个执行流程都熟悉了,在开发遇到问题也可以很快定位到问题. 更重要的,在面试中遇到 ...

  8. 简述计算机程序执行过程,计算机程序的执行过程

    [size=small]微型计算机中程序的执行过程 计算机采取"存储程序与程序控制"的工作方式,即事先把程序加载到计算机的存储器中,当启动运行后,计算机便会自动按照程序的要示进行工 ...

  9. HashSet中的add()方法( 三 )(详尽版)

    上接HashSet中的add()方法( 二 )(详尽版) ,前两篇说的是泛型为String类的add()方法的具体执行过程,此后三篇说说泛型为自定义类的add()方法的具体执行过程: 首先让我们来自定 ...

  10. HashSet中的add()方法( 一 )(详尽版)

    让我们用例子来理解add()方法的底层代码吧,Let's go: import java.util.HashSet;public class Test {public static void main ...

最新文章

  1. 深度学习无法解决的问题,只有强化学习才能解决
  2. FAT16文件系统结构扇区数据分析
  3. android 找不到符号 符号 RequiresApi
  4. Linux常用命令——paste
  5. Leetcode初级算法(链表篇)
  6. Autoencoder 详解
  7. .NET 5 中的隐藏特性
  8. JSP的9个内置对象-application
  9. #宝塔面板# #nginx+apache# KVS服务器运行环境搭建过程记录
  10. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·006【底部导航开发】
  11. 概率论---全概率公式和贝叶斯公式
  12. 错误数据(图片)去除
  13. ArrayList和LinkedList的异同
  14. 【BZOJ 4242】水壶
  15. TryHackMe-Gatekeeper
  16. 外部web端访问微信小程序云数据库的几种方法
  17. latex数学公式(行内(间)公式标注/希腊字母/数学函数/配对括号/定理环境
  18. 2008欧锦赛 球员名单 A组
  19. Python参考手册(第4版)pdf
  20. Rust 编程: 条件编译-Features

热门文章

  1. 31. Next Permutation
  2. 中小企业SAAS产品选型之分析自己的需求
  3. 常用正则表达式 (转)
  4. 7月20日专家在线访谈“员工上网管理是否可行”
  5. 微信分享ios 不显示图片和简介问题总结
  6. [转]Go语言中的make和new
  7. MATLAB实现连续周期信号的频谱分析(正余弦波信号举例)
  8. tomcat,httpd 日志格式说明
  9. 20145302张薇《Java程序设计》第三周学习总结
  10. error: ignoring return value of 编译错误处理