看了韩顺平老师的视频获益匪浅,但是这里有点不太懂,希望会的大神能帮助解答一下。第二次输出前的:set.add(new Person(1001,“CC”));为啥能add进HashSet中这里我很疑惑,自己看了源码打了断点还是有一些疑问,希望能帮我解答一下。自己仿照幻灯片的示例敲了一下代码。

package com.HomeWork;import org.junit.Test;import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.TreeSet;/*** @author 心向阳光的天域* @date 2022/10/10 17:56*/
public class HomeWork06 {@Test@SuppressWarnings({"all"})public void getHomeWork06() {People p1 = new People("1001", "AA");People p2 = new People("1002", "BB");HashSet hashSet = new HashSet();hashSet.add(p1);hashSet.add(p2);System.out.println("正常情况" + p1.hashCode()); //p1.name = "CC"; // 因为重写了hashCode,所以name变了之后hash值就会变System.out.println("修改p1为CC后:" + p1.hashCode()); //hashSet.remove(p1); // hash值变了之后,删除就找不到以前的p1了System.out.println("----第一次输出----");System.out.println(hashSet);People p3 = new People("1001", "CC"); // hashCode:System.out.println("p3的hashCode值:" + p3.hashCode()); //hashSet.add(p3); // 为啥这里add可以插进去?????????System.out.println("----第二次输出----");System.out.println(hashSet);hashSet.add(new People("1001", "AA")); // 这次System.out.println("----第三次输出----");System.out.println(hashSet);}class People {private String id;public String name;public People(String id, String name) {this.id = id;this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;People people = (People) o;return Objects.equals(id, people.id) && Objects.equals(name, people.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}@Overridepublic String toString() {return "People{" +"id='" + id + '\'' +", name='" + name + '\'' +'}';}
}


这里可以明显看到p1对象的hashCode和p3的hashCode一样。但是Debug之后出现了如下图的情况:

这里可以看到绿框框起来的p1对象和p3对象name对应的hash值是完全一样的,但是红框里的hashCode值又不一样,于是我追了一下源码看了看红框里hash值的计算规则。
如下代码所示:

 hashSet.add(p3); // 主要是add代码追进源码看//源码HashMap.class中//static class Node<K, V> implements Entry<K, V>Node(int var1, K var2, V var3, HashMap.Node<K, V> var4) {this.hash = var1; // 这里就是红框中的hash值this.key = var2;this.value = var3;this.next = var4;}// 而这里的var1也可以追溯源码HashMap.class中put方法public V put(K var1, V var2) {return this.putVal(hash(var1), var1, var2, false, true); // 这里可以看到Node的var1是来自add对象的hash方法}// 继续往下看hash方法的计算static final int hash(Object var0) { // 这里var0就是add后对象p3int var1;return var0 == null ? 0 : (var1 = var0.hashCode()) ^ var1 >>> 16; // 这里p1和p3的hashCode相同,为什么最后出来的红框中hash值却不同}

问题就是最后跟到源码,发现hash值的计算规则,就是分别拿p1和p3的哈希值进行按位与操作,这里是真的不懂为什么红框里计算出来的hash值为什么会不同,以及怎么理解这里能add进去的问题,希望会的大神能帮助解决一下我的困难,感谢。

韩顺平集合课后作业Homework06.java探讨相关推荐

  1. 韩顺平 HashSet 课后练习 2

    韩顺平 HashSet 课后练习 2 题目如下: 按照要求简单写了一下,将Employee和MyDate类都重写了equals方法和hashCode方法 package com.SetExercise ...

  2. 韩顺平 2021零基础学Java 学习笔记

    韩顺平 2021零基础学Java 学习笔记(1)(自用)_丨shallow丨的博客-CSDN博客_韩顺平java笔记 韩顺平 2021零基础学Java 学习笔记(2)(自用)_丨shallow丨的博客 ...

  3. 韩顺平 2021零基础学Java 学习笔记(2)(自用)

    目录 第 10 章 面向对象编程(高级部分) 第 11 章 枚举和注解 第 12 章 异常-Exception 第 13 章 常用类 第 10 章 面向对象编程(高级部分) 10.1 类变量和类方法 ...

  4. java韩顺平HashSet课后练习2

    import java.util.HashSet; import java.util.Objects;@SuppressWarnings({"all"}) public class ...

  5. 韩顺平 2022零基础学 Java 学习笔记(1)

    文章目录 续 - 第二阶段 小知识点: 1. 进程 | 线程 2. 静态方法与非静态方法的区别 ( static ) 算术运算符 << 左移 | 右移 >> 泛型 (重要) J ...

  6. 【韩顺平】Java线程(基础)知识点总结

    文章目录 1.线程概念 1.1程序 1.2进程 1.3线程 2.其他相关概念 2.1并发 2.2并行 2.3单线程 2.4多线程 3.创建线程的两种方法 3.1继承Thread类,重写run方法 3. ...

  7. Java坦克大战 跟学韩顺平老师视频开发

    这里写目录标题 TankBigWarGame 介绍 界面展示 项目架构 安装教程 游戏说明 项目涉及技术功能 游戏结束判断 项目不足与优化空间 相关代码展示 主方法Main 绘图界面 MyPanelF ...

  8. 尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业01

    尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业第一题 要求: 1)在前面的基础上,将稀疏数组保存到磁盘上,比如map.data 2) 恢复原来的数组时,读取map.data进行恢复 ...

  9. 韩顺平循序渐进学java 第21.22.23.24讲 集合

    21.1 引出问题 一个问题? 前面我们学习了数组,充分体会到数组的优越性,就是可以存储同一类型的数据,但是我们假设有这样的需求,大家看看如何解决? 请做一个公司职员薪水管理系统,要求完成如下功能: ...

最新文章

  1. #180111mysql启动错误
  2. we自动化po模式_Web自动化测试—PO设计模式(一)
  3. 18.Mysql SQL优化
  4. What?Java这么神奇的lambda表达式
  5. 20145324 《Java程序设计》第6周学习总结
  6. [转]MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  7. 网络限流linux,DockOne微信分享(一九八):容器网络限流实践
  8. Realtek RTL87xx 学习资源
  9. 计算机桌面出现家庭组,win7系统桌面突然多出一个家庭组图标的解决方法
  10. HtmlUnit实现人人网登陆
  11. ZJUT 2012校赛决赛-涂颜色
  12. 网页设计如何做?全流程其实只有这五步!
  13. 提升网站权重优化方法,网站权重优化步骤
  14. [Premiere Pro]新建尺寸设置(1080*1920手机屏幕尺寸)
  15. 开关电源输出纹波主要来源五个方面?示波器测纹波方法?
  16. 尼尔机器人技能快捷键_《尼尔:机械部队》组合按键技能使用攻略
  17. Cell:基于33个遗传多样性水稻种质泛基因组分析揭示“隐藏”的基因组变异
  18. 如何免费使用正版win10系统
  19. python画混淆矩阵 confusion matrix
  20. 给女朋友做个聊天机器人,这样就能安心写代码了

热门文章

  1. 脸部识别,简单图片识别
  2. 主流的视频动作类算法任务介绍
  3. oracle11g连接到数据库实例,oracle11g使用活动数据库复制数据库
  4. Oracle语法 及 SQL题目(二)
  5. 如何用API接口获得淘宝商品详情数据
  6. 中国智能物流行业市场规模及未来发展趋势
  7. 如何快速打开画图,计算器,记事本等小工具
  8. 做事情,做学问,还有生活。
  9. Java--获取环境变量(System.getenv)--方法/实例
  10. C/C++中的getenv()函数