当前位置: 首页 > 编程日记 > 正文

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

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

首先让我们来自定义一个学生类:

public class Student {private String id;public Student(String id) {this.id = id;}	
}

我们通过Test类来具体实现学生类:

import java.util.HashSet;public class Test {public static void main(String[] args) {HashSet<Student> set = new HashSet<Student>();//泛型为Studentset.add(new Student("100"));//当执行该行时,由于是第一次存值,与String类无异,所以这里就不再赘述了set.add(new Student("100"));//我们直接从再次存值讲起}
}

调用HashSet中的add()方法:
我们知道add()方法是有返回值的,若key一样,返回false,即添加失败;若key不一样,返回true,即添加成功

public boolean add(E e) {return map.put(e, PRESENT)==null;//e即为add()方法中的参数(此时即为第二个创建的对象的"100"),value为常量PERSENT(Object类型)
}
//从代码中可以看出,若put返回null,则add返回true,若put不返回null,则add返回false,那put()方法是怎么返回一个值的呢?让我们接着往下看:

接着调用HashMap中的put()方法:

public V put(K key, V value) {//key也是add()方法中的参数return putVal(hash(key), key, value, false, true);//此时先调用hash()方法,我们在(一)篇分析过了,它会返回一个int类型的值//而且在(零)篇中我们分析过,若泛型是自定义类类型(未重写equals()方法),//则返回的hash值是不同的(因为这两次的地址是不同的)
}
//此处就是将put()方法转交给putVal()方法,让putVal()来完成:返回一个值(null或!null)

再调用HashMap中的putVal()方法:
我们还是无需看完这段代码,只需要看其中的几行就可以了(主要是有注释的那几行)

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {//此处对应的就是上面传的那几个值Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)//因为table中已存入了一个值,所以table不为null,tab也不为null,所以tab.length也不为0//所以该if语句的条件不满足,直接跳到下一个if语句n = (tab = resize()).length;//因为未执行上一行,所以数组未进行初始化,所以数组仍是第一次存值时的数组,所以长度相同,即n不变if ((p = tab[i = (n - 1) & hash]) == null)//我们知道tab是一个数组,i是索引,而此时n值不变,hash值与第一次的hash值不同,//所以tab[i] == null 成立,所以执行下一行tab[i] = newNode(hash, key, value, null);//为tab[i]赋值,此时newNode中的key、value、hash即为第二次add()中的参数,及对应的value(常量)、和hash值//因为if语句已执行,所以此else语句不执行else {Node<K,V> e; K k;if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;//直接从这行代码开始执行if (++size > threshold)resize();afterNodeInsertion(evict);return null;
}

最后几行代码我们也不需要具体分析,我们关注的是最后一行代码:return null;会返回null,
我们上面提到,putVal返回null也就相当于put()返回null,所以add返回true,添加成功!

但我们知道学生的id号是唯一的、不可重复的,所以可以尝试一下重写hashCode()方法来试试:
我们接着看HashSet中的add()方法( 四 )(详尽版)

相关文章:

mono修改配置

当前mono安装目录为:/home/mono&#xff0c;安装成功后修改配置需进入这个路径&#xff1a; cd /home/mono 1.修改TcpBinaryFrameManager.cs文件 cd /home/mono/mono-2.10.8 vim mcs/class/System.ServiceModel/System.ServiceModel.Channels.NetTcp/TcpBinaryFrameManager.cs …

[Java in NetBeans] Lesson 01. Java Programming Basics

这个课程的参考视频在youtube。 主要学到的知识点有&#xff1a; Create new project, choose Java Application.one .jar file/ package(.jar name with the same as package), one package can contains mutiple .java files.Comment mutiple lines by using "/* */&quo…

ubuntu中常用指令

常用指令 清空命令行 CtrlL Conda 创建虚拟环境 conda create -n 虚拟环境名称 python3.7.10 查看虚拟环境列表 conda info --envs 激活虚拟环境 conda activate 虚拟环境名 退出虚拟环境 conda deactivate 虚拟环境名称 安装功能包 conda install 功能包名称 卸载功能包 con…

Ansible05-部署文件

目录 一、部署文件的常用模块 二、使用jinja2文件部署自定义文件 一、部署文件的常用模块 部署文件常用模块有 file 创建、删除文件或目录&#xff0c;修改selinux上下文。copy 复制文件到受控节点上&#xff0c;也可以直接在受控结点上创建文件。fetch 从受控结点获取文件…

HashSet中的add()方法( 四 )(详尽版)

上接 HashSet中的add()方法( 三 )&#xff08;详尽版&#xff09; &#xff0c;我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了&#xff0c; 在学生类中重写hashCode()方法&#xff1a; public class Student {private String id;public Studen…

Laravel框架中的event事件操作

有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑&#xff0c;比如说系统服务下的授权和事件&#xff0c;这些功能服务的应用场景是什么&#xff0c;其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情&#xff0c;但是当我们在工作中多加思考会发现有时候这些服务…

yolact_ros出坑记录

教程&#xff1a;https://github.com/Eruvae/yolact_ros 下载通信中的话题msg 创建虚拟环境 conda create -n yolact python3.7.10 conda activate yolact 配置yolact环境 https://github.com/dbolya/yolact 运行效果如下所示&#xff1a; 在虚拟环境中安装需要的包 conda …

堡垒机高危命令正则表达式

堡垒机可以设置高危命令阻断&#xff0c;防止操作人员误操作造成删库跑路。但是什么是高危命令&#xff0c;需要管理员通过配置正则表达式&#xff0c;进行命令匹配。 今天2021年8月6日先匹配最常见的删库跑路命令 rm -rf / &#xff0c;以下几种表达式联合起来就可以阻断这类…

实验吧 速度爆破

题目链接&#xff1a;http://ctf5.shiyanbar.com/ppc/sd.php 这道题很简单呀&#xff0c;一点斜的歪的都没有&#xff0c;只是我一个小菜鸟在完成时会遇到一些小麻烦&#xff0c;几度想去看wp&#xff0c;最后还是忍住了。。。 思路很简单 1、 先抓取页面里生成的hash值 2、 循…

返回一个二维整数数组中的最大的子数组和

一。题目&#xff1a; 1、输入一个二维整形数组&#xff0c;数组里有正数有负数。 2、二维数组中连续的一个子矩阵组成一个子数组。 3、求所有子数组的和的最大值。 二.设计思想&#xff1a; .定义一个二维数组&#xff0c;使用二重循环对其进行赋值&#xff0c;对其进行遍历&a…

HashSet中的add()方法( 五 )(详尽版)

上接 HashSet中的add()方法( 四 )&#xff08;详尽版&#xff09; &#xff0c;我们再重写一下equals()方法来看看是否可以不能存入相同的id&#xff1a; 在学生类中再重写equals()方法&#xff1a; public class Student {private String id;public Student(String id) {thi…

ROS话题通信中创建自定义数据类型的两种方式

一、在同一个功能包下创建.msg文件 1、在功能包目录下创建msg文件夹 2、在文件夹中创建.msg文件 3、在该功能包的package.xml文件中加入&#xff1a; <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>4、在…

2542513 - AS Java fails to start - Initialization of destination UMEBackendConnection failed

今天发现SAP As Java 开发机无法启动&#xff0c;根据 Note 2542513 处理该问题并记录。 今天发现SAP EPBPM服务器不能正常启动&#xff0c;jstart.exe进程显示 some process running 的黄灯状态。重启也不管用。到SAP官网 https://wiki.scn.sap.com/wiki/display/ASJAVA/%28J…

WordCount扩展与优化

合作者&#xff1a;201631062327&#xff0c;201631062128码云地址&#xff1a;https://gitee.com/LIUJIA6/WordCount3 一&#xff1a;项目说明 本次项目是在上次作业WorldCount的基础上&#xff0c;利用结对编程的思想&#xff0c;完成对WorldCount项目的功能扩展 -s 递归处理…

进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

我发现网上关于标题上的内容介绍的都很零碎&#xff0c;因此为了方便查找、也为了本人对这一部分的充分理解&#xff0c;就想着写一篇这样的博客&#xff08;我分成了几个部分&#xff0c;以便查找&#xff09;&#xff1a; 一、进制转换 让我们先来看看各个进制的定义&#…

第三方物流是什么

​​第三方物流是指生产经营企业为集中精力搞好主业&#xff0c;把原来属于自己处理的物流活动&#xff0c;以合同方式委托给专业物流服务企业&#xff0c;同时通过信息系统与物流企业保持密切联系&#xff0c;以达到对物流全程管理的控制的一种物流运作与管理方式。 第三方物流…

ROS中cv_bridge如何用python3进行编译

最近遇到了个问题&#xff0c;cv_bridge实现了opencv和ros中图像数据类型的转换&#xff0c;但ros-melodic默认python版本是python2。在配置yolact环境的时候&#xff0c;要求是python3。 这就导致在ros自带的cv_bridge是python2版本&#xff0c;想使用python3的话需要自己去编…

Ansible06-管理roles

目录 一、roles的结构 二、RHEL系统roles 三、创建角色 四、部署角色 随着 playbook 的增多&#xff0c;有很多代码重用的机会。ansible 提供了一种方式——roles&#xff0c;只需将 roles 从一个项目复制到另一个项目&#xff0c;然后用 play 调用即可实现代码重用。这里的…

用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)

不废话&#xff0c;上代码&#xff1a; 先创建一个Student类&#xff1a; public class Student {private String id;private String name;private String mobile;private String address;public String getId() {return id;}public void setId(String id) {this.id id;}pub…

[BZOJ 2054]疯狂的馒头(并查集)

Description CQF十分喜欢吃馒头。兴奋之下他一下子买了N 个馒头请所有认识他的人吃。 但是CQF不喜欢白色&#xff0c;喜欢红色、黄色、绿色等鲜艳的颜色。于是他把所有白色的馒头排成一列。然后进行M 次染色操作。每个染色操作都是用一个神奇的刷子把连续的多个馒头染成特定的某…

RealSenseD435与ORB-SLAM2实现稠密建图

一、RealSenseD435介绍 RealSenseD435是一款结构光相机&#xff0c;使用左右目相机和红外光实现测距。有效测距范围为0.2~10m 二、ORBSLAM2_with_pointcloud_map的安装 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.gitclone代码&#xff0c;无法…

使用appium做自动化测试时,send_keyss只能输入字母数字,无法输入中文

解决方案&#xff1a; driver中增加以下2行配置&#xff1a; "unicodeKeyboard":True, #unicode编码输入 "resetKeyboard":True #隐藏软键盘 转载于:https://www.cnblogs.com/Inbreeze/p/9828568.html

centos8安装KVM/QEUM虚拟化

centos8安装KVM/QEUM。安装虚拟化主机组。启动libvirtd服务。 yum groupinstall "Virtualization Host" systemctl enable libvirtd systemctl start libvirtd 谁可以使用虚拟化呢&#xff1f;加入libvirt组即可。 usermod -aG libvirt <username> 安装Vir…

病毒的灵魂拷问(绝对原创)

哈哈哈&#xff0c;我敢说&#xff0c;这篇博客绝不会有重复的&#xff0c;因为它是我上课的走神之作&#xff0c;哈哈哈&#xff01; 不废话&#xff0c;上代码&#xff1a; import java.util.Scanner; import java.util.*; public class Test {public static void main(Str…

js:深入prototype(下:原型重写)

//当属性和方法特别多时&#xff0c;编写起来不是非常方便&#xff0c;能够通过json的格式来编写 //因为原型重写。并且没有通过Person.prototype来指定&#xff0c;此时的constructor不会再指向Person而是指向Object //假设constructor真的比較重要&#xff0c;能够在json中说…

全国所有省市县地理坐标Json格式

https://www.cnblogs.com/yzbubble/p/7707129.html转载于:https://www.cnblogs.com/loveMis/p/9829217.html

ubuntu设置不同的eigen版本

下载Eigen并进行编译 下载eigen库&#xff0c;创建build文件夹进行编译 设置安装路径 这里会设置make install的路径 随后进行make install 移动到usr/include路径下 找到第二步中安装的位置&#xff0c;移动到usr/include路径下 这样&#xff0c;需要用那个版本的eige…

MySQL01-安装mysql数据库

MySQL 可以从 YUM 源直接安装 rpm 包&#xff0c;但是这样的定制化程度低&#xff0c;不利于后期维护升级。因此&#xff0c;今天记录一种更灵活的二进制安装方式。参考 MySQL 5.7 官方文档 2.2 章节&#xff0c;具体做法和官方文档略有出入。 1、配置防火墙规则 firewall-cm…

SVO学习笔记(一)

SVO学习笔记&#xff08;一&#xff09;这篇文章FrameFeaturedetectionFeatrue_matcher三角测量求深度特征匹配非线性优化寻找匹配特征极线搜索匹配特征总结这篇文章 一个很年轻的叔叔踩进了SLAM的坑&#xff0c;现在正在学习视觉SLAM中的SVO系统。本着好记性不如烂笔头的思想&…

如何用eclipse操作MySQL数据库进行增删改查?

我们首先需要在Navicat Premium上创建一个数据库实例&#xff08;test&#xff09;&#xff0c;然后创建一个stu_info表&#xff08;id&#xff0c;name&#xff0c;mobile&#xff0c;address&#xff09; 接着创建一个Test类进行操作&#xff1a; 在这之前需要导一个包&#…