我们知道在使用HashSet集合时,也就是在用HashMap集合,这是因为HashSet的底层是HashMap,

public HashSet() {map = new HashMap<>();
}

在详述HashSet中的add()方法之前,我们要知道HashMap中的hash,因为在add()的底层代码中hash很重要(因为要通过hash来判断key的值是否相同,进而决定是否add()是否可以添加成功):

static final int hash(Object key) {//此处的key就是HashMap中的key,也就是HashSet中的add()方法里的参数对象int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);//此处为三目运算,通过hashCode来决定h的值,//其中使用hashCode的返回值是由add()方法里的参数对象的类型决定的
}

hashCode的返回值 主要分为三种:

  1. 基本数据包装类:如果值相同,则返回值也相同,且返回值就是输入的值
  2. String类:如果内容相同,则返回值也相同
  3. 自定义类类型:如果地址相同,则返回值相同,否则不同
public class Test {static int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}public static void main(String[] args) {HashSet<String> set = new HashSet<>();//基本数据包装类Integer x = 20;Integer y = new Integer(20);System.out.println(hash(x));System.out.println(hash(y));//String类   String str1="hashCode";String str2=new String("hashCode");System.out.println(hash(str1));System.out.println(hash(str2));//自定义类类型Self s1 = new Self();Self s2 = new Self();System.out.println(hash(s1));System.out.println(hash(s2));    }
}
class Self{}//自定义一个类

上面输出的结果就是:
20
20
147694806
147694806
5433712
2430314
之所以会这样,是因为:Integer 、String 中都重写了父类(Object)中的hashCode()方法,而自定义类Self未重写(所以调用的是父类中的hashCode()方法):

  • Integer中重写的hashCode()方法:
@Override
public int hashCode() {return Integer.hashCode(value);//传入一个Integer值
}public static int hashCode(int value) {return value;//返回该值}
  • String中重写的hashCode()方法:
public int hashCode() {int h = hash;//hash默认值为0if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;
}

总之,上面这串代码,最初的h值相同,add()中的参数相同,所以最后的返回值h相同。

而父类中的hashCode是由参数地址决定的,地址相同,返回值相同,地址不同,返回值也不同

好了,明白了hash和hashCode,我们就详细说明HashSet中的add()方法( 一 )(详尽版)吧

HashSet中的add()方法( 零 )(详尽版)相关推荐

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

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

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

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

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

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

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

    让我们用例子来理解add()方法的底层代码吧,Let's go: import java.util.HashSet;public class Test {public static void main ...

  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. 软件工具将GPU代码迁移到fpga以用于AI应用
  2. nodejs 运行linux命令,node.js执行shell命令
  3. JavaWeb_响应和请求数据包
  4. mybaits十九:bind绑定
  5. Codeforces 989C (构造)
  6. mysql jdbc allow_mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理
  7. 'mysql_attr_use_buffered_query'_php中mysql操作的buffer知识
  8. 信息学奥赛一本通C++语言——1059:求平均年龄
  9. js解码编码decodeURI与decodeURIComponent区别
  10. If 的替代词汇:unless、in case..._60
  11. wordpress文章页饮用php文件,wordpress主题的文章和页面如何运行php代码?
  12. Office在线协作(三)- O2OA连接本地部署的OnlyOffice Docs Server服务器 For Windows Server
  13. “程序已停止工作”问题的解决方法
  14. win10磁盘管理 磁盘分区和合并
  15. 项目市场调查报告的撰写要则
  16. word2010中插入脚注和尾注
  17. PDP context激活的大致原理
  18. 定积分的性质——积分中值定理
  19. 【Excel】使用宏处理重复操作示例 -- 录制分列操作
  20. Pipeline支撑运维自动化:sftp原子模块

热门文章

  1. C++ STL的reserve函数
  2. ubuntu chm文档阅读器
  3. HDU1402(FFT入门)
  4. (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态
  5. USACO JANUARY——矩形[rects]
  6. 异步调用WCF的方法需要小心的地方
  7. Edit Distance
  8. 全球15个顶级技术类博客
  9. GridView隐藏列取值解决方案
  10. 一个请求从 URL 字符串到 HTML 代码的“漫长曲折”之路