让我们用例子来理解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()方法( 一 )(详尽版)相关推荐

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

    上接 HashSet中的add()方法( 四 )(详尽版) ,我们再重写一下equals()方法来看看是否可以不能存入相同的id: 在学生类中再重写equals()方法: public class S ...

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

    上接 HashSet中的add()方法( 三 )(详尽版) ,我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了, 在学生类中重写hashCode()方法: p ...

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

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

  4. HashSet中的add()方法( 零 )(详尽版)

    我们知道在使用HashSet集合时,也就是在用HashMap集合,这是因为HashSet的底层是HashMap, public HashSet() {map = new HashMap<> ...

  5. HashSet中的add()方法( 二 )(详尽版)

    本篇接着上一篇:(详尽版)HashSet中的add()方法( 一 )(详尽版) 有些东西上一篇说过了,这里就不再赘述了,具体说一下再次添加与第一次添加的区别: import java.util.Has ...

  6. android中的add方法,Android入门之addWindow

    前面说到,应用程序添加窗口时,会在本地创建一个ViewRoot,然后通过IPC(进程间通信)调用WmS的Session的addWindow请求WmS创建窗口,下面来看看addWindow方法. add ...

  7. JAVA中的add()方法为什么可以直接到用

    都不标明add()是哪个类的方法,是个什么方法? 方法调用是这样的; 类中所有的非静态方法的调用是需要指明是哪个对象在调用, 如果在一个方法中调用了本类或其父类的方法,没有指明对象, 就是相当于thi ...

  8. android中的add方法,Android中Fragment怎么addView?

    慕勒3428872 Fragment是Android honeycomb 3.0新增的概念,在Android--Fragment介绍.AndroidFragment使用.Android Fragmen ...

  9. java的add方法的使用_Java HashSet add()方法与示例

    HashSet类add()方法add()方法在java.util包中可用. 当尚不存在给定元素时,使用add()方法将其插入此HashSet中,否则它将忽略它并返回false. add()方法是一种非 ...

最新文章

  1. 如何做好网站项目需求分析?
  2. 《程序员的自我修养》
  3. 如何获得瑞星网络安全工程师
  4. IOS8的新特性:简洁易用的毛玻璃效果
  5. 【记录】 安装qflow on ubuntu 16.04
  6. 跨浏览器兼容的HTML5视频音频播放器
  7. 工作日历计划javaweb_将你的日历与 Ansible 集成,以避免与日程冲突 | Linux 中国...
  8. 20200727:力扣第31周双周赛题解
  9. 发牌游戏 java_解析扑克牌游戏发牌算法——java实现
  10. 使用YOLO V4通过社交距离和口罩检测来缓解COVID
  11. wxpython画表格代码
  12. php 冷门与常用函数
  13. Spring的refresh()方法相关异常
  14. 荷兰国旗问题python_关于荷的诗句大全
  15. rasp 系统_浅谈RASP技术攻防之基础篇
  16. 移动机器人传感器——GNSS
  17. 教育期刊《中学数学教学参考》杂志简介及投稿须知
  18. Windows应用程序C#创建MDI父窗体和子窗体
  19. 微软小娜 服务器连不上网,win10小娜怎么连不上网 win10小娜没反应怎么回事
  20. UVA340紫外线灯管

热门文章

  1. 嵌入式开发板设置无密码登录
  2. 逆向-攻防世界-maze
  3. 【洛谷p1313】计算系数
  4. git常用命令及规范流程
  5. D3.js、HTML5、canvas 开发专题
  6. Laravel Predis Error while reading line from the server.
  7. Shark Hive Spark Hadoop2 进行整合的测试。
  8. vmware克隆centos修改linux mac地址
  9. 思念水饺吃成泡沫水饺(图)思念质量门
  10. 【Boost】noncopyable:不可拷贝