Object类型添加操作判读

第一步:程序首先创建一个Object泛型的Set数组,这里用到了上转型;

第二步:执行object里面的add添加方法,传进的值为“JAVA”;

首先HashSet源代码中会有HashSet的无参构造方法:说明只要创建一个HashSet数组就会默认创建一个HashMap数组

因为Set的add方法被HashSet重写过,所以运行时add会运行HashSet的add方法,此时我们打开HashSet中add方法:

此时参数e为刚刚传进的”JAVA“。

可以看到add方法调用的map里面的put方法,传入e和一个常量(常量全大写),判断是不是null(空)。

此时我们进入map里的put方法:

此时可以看到put需要的参数为key值和value对应刚刚传入的e和一个常量,此时可以看到put里面调用的是putVal方法,

传入的值为hash(key),key,value,false,true。此时打开参数列表中hash(key)方法来查看hash(key)的值到底是个什么样的值:

hash方法传进来的参数为key为e也就是”JAVA“,这里为三目运算,若为空返回0,不为空返回一个”JAVA“特定的hashCode然后在被处理的值

此时搞明白参数列表我们就需要查看putVal方法体:

参数hash,key,value,onlyIfAbsent,evict

其中hash随你key参数变化而变化,key为你要存入的数据(”JAVA“),后三位为常量 false true;

第一步 创建tab,p数组和int类型的n和i:

进入判断语句

将table地址值赋值给tab ,table为一个全局变量默认值为null,而且后边判断条件也成立,直接进入方法体

此时需要进入resize方法:

oldTab为空数组,oldCap为0,oldThr为0,创建两个变量为0;

随后经过判断预计进入:

此时newCap为16,作用为数组默认容量初始为16;后面常量为16;newThr为16*0.75作用为0.75倍扩容

此后进入

下一步:

长度为16的数组,下一步返回

长度为16的空数组,此时走完resize()方法,回到putVal

此时n为16此时进入下一不判断语句:

用来判断tab中i = (n - 1) & hash]位元素是否为空,此时为空,赋给tab中i为元素为newNode,newNode方法体为:

此时tab第i为有值了,然后程序接着走:

最后返回一个null给调用它的put方法:

put也返回null给调用它的方法add:

判断为true,此时返回给objects数组true添加成功:

到此添加程序结束。

第二次添加第二个if成立进入:

不成立进入else

先进入如图if判断,判断上一个不为空的hash值与这个要添加的hash值是否相等,经过hash原代码可知为相等并且,Object的equals方法比较的内存地址也相等,因为没new对象,都在一个常量池中,所以成立把p赋给e:下一步进入

因为e不为空(null),所以赋值给oldValue为一个常量PRESENT,返回给put,put返回给add:

因为PRESENT不等于null,所以返回给objects.add("JAVA");的值为false:

此时添加失败,正好印证了HashSet不能添加重复元素的特性。

最新文章

  1. Thrift-java实例
  2. 用python实现的百度新歌榜、热歌榜下载器
  3. C#微信开发小白成长教程二(新手接入指南,附视频)
  4. cf666 C. Codeword 组合数学 离线分块思想
  5. MYSQL - ORDER BY & LIMIT
  6. bzoj3083 3306
  7. O(1)时间删除链表节点
  8. UVa1585 Score
  9. 实现StatusBar的Flat风格
  10. 利用Perf4j 对java项目进行性能监控
  11. 2016年团体程序设计天梯赛-决赛 L1-5. 是不是太胖了(5)
  12. Django的用户认证
  13. sockaddr结构体
  14. Struts2-046验证脚本
  15. 前端学习:html基础学习二
  16. shell入门之函数应用
  17. ipython介绍及使用
  18. 使用jpcap获取网卡硬件
  19. JobEngine 基于quartz.net 跨平台作业框架
  20. go语言学习框架

热门文章

  1. NIO三大组件之Selector选择器
  2. 使用shell脚本替换Hadoop配置文件的值
  3. 解决unbutu网络编程socket_tcp连接不上网络助手
  4. Linux 切换用户提示Permission denied
  5. 计算机图形学中使用Turbo C++画图步骤
  6. 13、Script file 'E:\Anaconda Distribution\Anaconda\Scripts\pip-script.py' is not present.
  7. 普通 Javaweb项目模板的搭建
  8. Python fire库使用
  9. [2020年10月28日普级组]1405.小B浇花
  10. Recoil 默认值及数据级联的使用