韩顺平集合课后作业Homework06.java探讨
看了韩顺平老师的视频获益匪浅,但是这里有点不太懂,希望会的大神能帮助解答一下。第二次输出前的: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探讨相关推荐
- 韩顺平 HashSet 课后练习 2
韩顺平 HashSet 课后练习 2 题目如下: 按照要求简单写了一下,将Employee和MyDate类都重写了equals方法和hashCode方法 package com.SetExercise ...
- 韩顺平 2021零基础学Java 学习笔记
韩顺平 2021零基础学Java 学习笔记(1)(自用)_丨shallow丨的博客-CSDN博客_韩顺平java笔记 韩顺平 2021零基础学Java 学习笔记(2)(自用)_丨shallow丨的博客 ...
- 韩顺平 2021零基础学Java 学习笔记(2)(自用)
目录 第 10 章 面向对象编程(高级部分) 第 11 章 枚举和注解 第 12 章 异常-Exception 第 13 章 常用类 第 10 章 面向对象编程(高级部分) 10.1 类变量和类方法 ...
- java韩顺平HashSet课后练习2
import java.util.HashSet; import java.util.Objects;@SuppressWarnings({"all"}) public class ...
- 韩顺平 2022零基础学 Java 学习笔记(1)
文章目录 续 - 第二阶段 小知识点: 1. 进程 | 线程 2. 静态方法与非静态方法的区别 ( static ) 算术运算符 << 左移 | 右移 >> 泛型 (重要) J ...
- 【韩顺平】Java线程(基础)知识点总结
文章目录 1.线程概念 1.1程序 1.2进程 1.3线程 2.其他相关概念 2.1并发 2.2并行 2.3单线程 2.4多线程 3.创建线程的两种方法 3.1继承Thread类,重写run方法 3. ...
- Java坦克大战 跟学韩顺平老师视频开发
这里写目录标题 TankBigWarGame 介绍 界面展示 项目架构 安装教程 游戏说明 项目涉及技术功能 游戏结束判断 项目不足与优化空间 相关代码展示 主方法Main 绘图界面 MyPanelF ...
- 尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业01
尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业第一题 要求: 1)在前面的基础上,将稀疏数组保存到磁盘上,比如map.data 2) 恢复原来的数组时,读取map.data进行恢复 ...
- 韩顺平循序渐进学java 第21.22.23.24讲 集合
21.1 引出问题 一个问题? 前面我们学习了数组,充分体会到数组的优越性,就是可以存储同一类型的数据,但是我们假设有这样的需求,大家看看如何解决? 请做一个公司职员薪水管理系统,要求完成如下功能: ...
最新文章
- #180111mysql启动错误
- we自动化po模式_Web自动化测试—PO设计模式(一)
- 18.Mysql SQL优化
- What?Java这么神奇的lambda表达式
- 20145324 《Java程序设计》第6周学习总结
- [转]MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
- 网络限流linux,DockOne微信分享(一九八):容器网络限流实践
- Realtek RTL87xx 学习资源
- 计算机桌面出现家庭组,win7系统桌面突然多出一个家庭组图标的解决方法
- HtmlUnit实现人人网登陆
- ZJUT 2012校赛决赛-涂颜色
- 网页设计如何做?全流程其实只有这五步!
- 提升网站权重优化方法,网站权重优化步骤
- [Premiere Pro]新建尺寸设置(1080*1920手机屏幕尺寸)
- 开关电源输出纹波主要来源五个方面?示波器测纹波方法?
- 尼尔机器人技能快捷键_《尼尔:机械部队》组合按键技能使用攻略
- Cell:基于33个遗传多样性水稻种质泛基因组分析揭示“隐藏”的基因组变异
- 如何免费使用正版win10系统
- python画混淆矩阵 confusion matrix
- 给女朋友做个聊天机器人,这样就能安心写代码了