HashSet中的add()方法( 一 )(详尽版)
让我们用例子来理解add()方法的底层代码吧,Let’s go:
import java.util.HashSet;public class Test {public static void main(String[] args) {HashSet<String> names = new HashSet<String>();names.add("Jim");//向HashMap集合的key中存值,而此时HashMap中的value是一个常量 Object}
}
调用HashSet中的add()方法:
我们知道add()方法是有返回值的,若key一样,返回false,即添加失败;若key不一样,返回true,即添加成功
public boolean add(E e) {return map.put(e, PRESENT)==null;//e即为参数“Jim”,value为常量PERSENT
}
//从代码中可以看出,若put返回null,则add返回true,若put不返回null,则add返回false,那put()方法是怎么返回一个值的呢?让我们接着往下看:
接着调用HashMap中的put()方法:
public V put(K key, V value) {//key即为参数“Jim”return putVal(hash(key), key, value, false, true);//此时先调用hash()方法,我们在上一篇分析过了,它会返回一个int类型的值
}
//此处就是将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 = table) == null为truen = (tab = resize()).length;//这里我们不必深究,其作用就是resize()初始化一个数组值给tab,所以此时tab不为null,且将数组的长度赋给n//总之,上面的这个if语句主要为了给全局变量table赋值,且将数组的长度赋给nif ((p = tab[i = (n - 1) & hash]) == null)// 因为tab为一个数组,所以i为索引,而i = (n - 1) & hash是为i赋值的,因为是第一次存储值,所以tab[i],也就是p 一定为nulltab[i] = newNode(hash, key, value, null);//满足if条件,执行该语句,即为tab[i]赋值,其中newNode中的key、value、hash即为add()中的参数,及对应的value(常量)、和hash值//以下else语句块代码不用看,这是再次添加值时要做的判断:判断key是否相同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,添加成功!
现在我们知道了通过add()来成功添加一个值时 代码的运行过程
那么当再次通过add()来添加值,且参数相同时,为何会添加失败呢?我们接着看HashSet中的add()方法( 二 )(详尽版)
HashSet中的add()方法( 一 )(详尽版)相关推荐
- HashSet中的add()方法( 五 )(详尽版)
上接 HashSet中的add()方法( 四 )(详尽版) ,我们再重写一下equals()方法来看看是否可以不能存入相同的id: 在学生类中再重写equals()方法: public class S ...
- HashSet中的add()方法( 四 )(详尽版)
上接 HashSet中的add()方法( 三 )(详尽版) ,我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了, 在学生类中重写hashCode()方法: p ...
- HashSet中的add()方法( 三 )(详尽版)
上接HashSet中的add()方法( 二 )(详尽版) ,前两篇说的是泛型为String类的add()方法的具体执行过程,此后三篇说说泛型为自定义类的add()方法的具体执行过程: 首先让我们来自定 ...
- HashSet中的add()方法( 零 )(详尽版)
我们知道在使用HashSet集合时,也就是在用HashMap集合,这是因为HashSet的底层是HashMap, public HashSet() {map = new HashMap<> ...
- HashSet中的add()方法( 二 )(详尽版)
本篇接着上一篇:(详尽版)HashSet中的add()方法( 一 )(详尽版) 有些东西上一篇说过了,这里就不再赘述了,具体说一下再次添加与第一次添加的区别: import java.util.Has ...
- android中的add方法,Android入门之addWindow
前面说到,应用程序添加窗口时,会在本地创建一个ViewRoot,然后通过IPC(进程间通信)调用WmS的Session的addWindow请求WmS创建窗口,下面来看看addWindow方法. add ...
- JAVA中的add()方法为什么可以直接到用
都不标明add()是哪个类的方法,是个什么方法? 方法调用是这样的; 类中所有的非静态方法的调用是需要指明是哪个对象在调用, 如果在一个方法中调用了本类或其父类的方法,没有指明对象, 就是相当于thi ...
- android中的add方法,Android中Fragment怎么addView?
慕勒3428872 Fragment是Android honeycomb 3.0新增的概念,在Android--Fragment介绍.AndroidFragment使用.Android Fragmen ...
- java的add方法的使用_Java HashSet add()方法与示例
HashSet类add()方法add()方法在java.util包中可用. 当尚不存在给定元素时,使用add()方法将其插入此HashSet中,否则它将忽略它并返回false. add()方法是一种非 ...
最新文章
- 如何做好网站项目需求分析?
- 《程序员的自我修养》
- 如何获得瑞星网络安全工程师
- IOS8的新特性:简洁易用的毛玻璃效果
- 【记录】 安装qflow on ubuntu 16.04
- 跨浏览器兼容的HTML5视频音频播放器
- 工作日历计划javaweb_将你的日历与 Ansible 集成,以避免与日程冲突 | Linux 中国...
- 20200727:力扣第31周双周赛题解
- 发牌游戏 java_解析扑克牌游戏发牌算法——java实现
- 使用YOLO V4通过社交距离和口罩检测来缓解COVID
- wxpython画表格代码
- php 冷门与常用函数
- Spring的refresh()方法相关异常
- 荷兰国旗问题python_关于荷的诗句大全
- rasp 系统_浅谈RASP技术攻防之基础篇
- 移动机器人传感器——GNSS
- 教育期刊《中学数学教学参考》杂志简介及投稿须知
- Windows应用程序C#创建MDI父窗体和子窗体
- 微软小娜 服务器连不上网,win10小娜怎么连不上网 win10小娜没反应怎么回事
- UVA340紫外线灯管