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不能添加重复元素的特性。

HashSet添加操作底层判读(Object类型)的更多相关文章

  1. java集合专题 (ArrayList、HashSet等集合底层结构及扩容机制、HashMap源码)

    一.数组与集合比较 数组: 1)长度开始时必须指定,而且一旦指定,不能更改 2)保存的必须为同一类型的元素 3)使用数组进行增加/删除元素-比较麻烦 集合: 1)可以动态保存任意多个对象,使用比较方便 ...

  2. HashSet 添加/遍历元素源码分析

    HashSet 类图 HashSet 简单说明 HashSet 实现了 Set 接口 HashSet 底层实际上是由 HashMap 实现的 public HashSet() { map = new ...

  3. Object类型与Array类型

    总结--JS中的引用类型: Object类型,Array类型,Boolean类型,Number类型,String类型,Date类型, Function类型,RegExp类型,单体内置对象(Global ...

  4. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  5. 《JavaScript高级程序设计》读书笔记(三)基本概念第三小节 String、Object类型

    内容---语法 上一小节---数据类型 本小节 String类型---流程控制语句---理解函数 String类型--零个或者多个16位Unicode字符组成字符序列,即字符串--可以由双引号&quo ...

  6. 引用类型--Object类型、Array类型

    引用类型的值(对象)是引用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,它描述的是一类对象具有的属性和方法. 对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数 ...

  7. JS高程5.引用类型(1)Object类型

    引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...

  8. 5.1 JS中Object类型

    1.Object类型是引用类型中的一种. 2.创建Object实例(对象)的方式: 方式1:使用new操作符,后面跟上Object构造函数.如: var obj = new Object();//创建 ...

  9. 引用类型之object类型

    object类型有两种创建方法,第一种是直接创建法: var person=new Object(); person.name = "Nicholas"; person.age = ...

随机推荐

  1. 微服务分布式事务之LCN、TCC

    在亿级流量架构之分布式事务解决方案对比中, 已经简单阐明了从本机事务到分布式事务的演变过程, 文章的最后简单说明了TCC事务, 这儿将会深入了解TCC事务是原理, 以及理论支持, 最后会用Demo举例 ...

  2. Python中并发、多线程等

    1.基本概念 并发和并行的区别: 1)并行,parallel 同时做某些事,可以互不干扰的同一时刻做几件事.(解决并发的一种方法) 高速公路多个车道,车辆都在跑.同一时刻. 2)并发 concurre ...

  3. 【新阁教育】台达DVP-ES3 ModbusTCP通信案例

    本文主要针对台达DVP-ES3系列PLC,实现上位机与PLC之间的ModbusTCP通信. 一.硬件说明 DVP-ES3 系列为高阶应用可编程控制器, CPU 内置4 组高速计数器输入.4组轴输出(脉 ...

  4. CPU 权限划分

    Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果普 ...

  5. Filebeat配置文件解析-转载

    转载地址:https://dongbo0737.github.io/2017/06/13/filebeat-config/ Filebeat配置文件解析 filebeat 一个ELK架构中,专门用来收 ...

  6. C#委托的学习了解

    C#的委托(Delegate)类似于C\C++的函数指针.委托是存有对某一个方法引用的一种引用变量类型,引用可在运行时被改变. 委托特别用于实现事件和回调方法.所有的委托都派生自System.Dele ...

  7. OO第一单元作业——魔幻求导

    简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...

  8. windows上phpstudy配置memcache

    原文   http://blog.csdn.net/ltx06/article/details/78588448   总的来说,分两步:同时安装memcached软件服务和安装php_memcache ...

  9. FastAPI项目实战:"异步"接口测试"平台"

    apiAutoTestWeb 是什么? apiAutoTest接口自动化测试工具的可视化版本,将原本对用例的操作转移到Web页面之上 用什么实现? 接口自动化测试:大体上测试逻辑将采用apiAutoT ...

  10. 《C++ primer》学习笔记整理

    简介 本笔记目前已包含<C++ Primer>中的绝大部分内容,但尚有部分小节有所缺漏,如 19.1.19.2 节的笔记尚未整理,会持续更新. 本项目中的学习笔记是在学完一章内容后,对其要 ...