java——equals(),hashCode()重写与不重写区别

2023-11-10

1,总结
(1)两个obj,如果equals()相等,hashCode()一定相等。
(2)两个obj,如果hashCode()相等,equals()不一定相等。
2,不重写equals(),hashCode()
不重写的时候,比较两个对象是否“相等“,默认跟”==“效果相同,直接比较两个对象的内存地址值。【此时,克隆出来的对象与原有对象有着不同的哈希值(毕竟是克隆出来的,是两个对象)】
3,重写equals(),hashCode()。
按快捷键重写的这两个方法的时候是这样的
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;

    Student student = (Student) o;

    if (age != student.age) return false;
    if (!name.equals(student.name)) return false;
    if (!gender.equals(student.gender)) return false;
    return school.equals(student.school);
}

@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + gender.hashCode();
    result = 31 * result + age;
    result = 31 * result + school.hashCode();
    return result;
}

此时,重写了equals(),hashCode()。哈希值是根据成员变量得来的,如果成员变量一致,则无论时新new出来的两个对象,还是克隆出来的对象跟原对象的哈希值都是一致的。
如果改变某个对象的某个成员变量,该对象的哈希值都会发生相应的改变。
++++++++++++++++++++++++例子++++++++++++++++++++++++++++++++
public class Student implements Cloneable{
private String name;
private String gender;
private int age;
private String school;

public Student() {
}

public Student(String name, String gender, int age, String school) {
    this.name = name;
    this.gender = gender;
    this.age = age;
    this.school = school;
}

@Override
public String toString() {
    return "Student{" +
            "name='" + name + '\'' +
            ", gender='" + gender + '\'' +
            ", age=" + age +
            ", school='" + school + '\'' +
            '}';
}

@Override
protected Object clone() throws CloneNotSupportedException {
    return super.clone();
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getSchool() {
    return school;
}

public void setSchool(String school) {
    this.school = school;
}

/**
 * 这个方法是自己手动重写的equals(),其实可以按快捷键同事重写
 * equals()hashCode(),这两个方法有必要同时重写,已维护hashCOde
 * 方法的常规协定,该协定声明相等对象必须有相等的哈希值
 * @param obj
 * @return
 */

// @Override
// public boolean equals(Object obj) {
// /*
// * 需要在equals()方法中提供自己的判断标准
// * 常常拿成员变量是否相等来处理
// * */
//
return super.equals(obj);
//
// if(this==obj){
// return true;
// }
// //成员变量对比
// //向下类型转换
//
Student stu=(Student) obj;
// //又因为,ClassException,当向下类型转换时,有可能类型不一样,
// // 所以可以使用instanceof(一个运算符)判断当前对象是否是某一个类型的实例
// if(obj instanceof Student){
// Student stu=(Student) obj;
// if(this.age!=stu.age){
// return false;
// }
// if(!this.name.equals(name)){
// //这里的equals是String类型的equals
// return false;
// }
// if(!this.gender.equals(stu.gender)){
// return false;
// }
// if(!this.school.equals(stu.school)){
// return false;
// }
// return true;
// }
//
//
// return false;
// }

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Student)) return false;

    Student student = (Student) o;

    if (age != student.age) return false;
    if (!name.equals(student.name)) return false;
    if (!gender.equals(student.gender)) return false;
    return school.equals(student.school);
}

@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + gender.hashCode();
    result = 31 * result + age;
    result = 31 * result + school.hashCode();
    return result;
}

}
++++++++++++++++++++++++++++++++++++++++++++++
public class StudentDemo {
public static void main(String[] args){
Student stu1=new Student(“jerry”,“男”,20,“轻工业”);
Student stu2=new Student(“jerry”,“男”,20,“轻工业”);
System.out.println(“stu1”+stu1);
System.out.println(“stu2”+stu2);
System.out.println(“stu1#hashCode”+stu1.hashCode());
System.out.println(“stu2#hashCode”+stu2.hashCode());
System.out.println(“clone===”);
try {
Student stu3=(Student) stu1.clone();
System.out.println(“stu1”+stu1);
System.out.println(“stu3”+stu3);
System.out.println(“stu1#hashCode”+stu1.hashCode());
System.out.println(“stu3#hashCode”+stu3.hashCode());
//改变克隆出来的对象的某个成员变量,再看效果
System.out.println(“clone改变后===”);
stu3.setName(“jerrp”);
System.out.println(“stu1”+stu1);
System.out.println(“stu3”+stu3);
System.out.println(“stu1#hashCode”+stu1.hashCode());
System.out.println(“stu3#hashCode”+stu3.hashCode());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java——equals(),hashCode()重写与不重写区别 的相关文章

  • 获取对 JOptionPane 静态方法创建的对象的引用

    我想知道是否可以获取对由 JOptionPane 的静态方法之一 例如 showMessageDialog 创建的 JDialog 对象的引用 我打算修改对话框在屏幕上出现的位置 更具体地说 我希望对话框默认显示在主应用程序窗口的左上角 而
  • Chrome 崩溃:尝试在空对象引用上调用虚拟方法“long android.view.accessibility.AccessibilityNodeInfo.getSourceNodeId()”

    在处理网页的搜索表单 JavaScript CSS HTML 时 每次单击网络搜索图标并且输入字段获得焦点时 Chrome 浏览器 Android 10 都会崩溃 崩溃报告中的调试堆栈跟踪显示 Attempt to invoke virtu
  • GAE 上奇怪的 500 错误

    我今天开始在我的应用程序上收到此错误 根本不记得更改任何内容 每当我在本地尝试时它都工作正常 但部署后我会收到此错误 EXCEPTION java lang ClassNotFoundException se myApp server My
  • 使用 iText 在内存上生成在磁盘上生成的 PDF

    我正在从 Java 应用程序生成 PDF 并且效果很好 问题是 PDF 在磁盘上生成为 Document documento new Document PageSize A4 25 25 25 25 PdfWriter writer Pdf
  • Java 正则表达式中 \w 和 \b 的 Unicode 等效项?

    许多现代正则表达式实现解释 w字符类简写为 任何字母 数字或连接标点符号 通常 下划线 这样 正则表达式就像 w 匹配像这样的词hello l ve GO 432 or gefr ig 不幸的是 Java 没有 在爪哇 w仅限于 A Za
  • Java 8 流排序字符串列表[重复]

    这个问题在这里已经有答案了 我正在流上调用排序方法 java 文档说 Sorted 方法返回一个由该流的元素组成的流 并根据自然顺序排序 但是当我运行下面的代码时 List
  • 如何修复XSS漏洞

    我们正在使用 fortify 扫描 java 源代码 它抱怨以下错误 Method abc sends unvalidated data to a web browser on line 200 which can result in th
  • Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 zzbqo()Z;或其超类(“com.google.firebase.FirebaseApp”的声明

    在我的 Android 应用程序中 编译应用程序时出现错误 我正在最新的 android studio 中工作 并使用 Firebase UI Auth 和 Firebase 数据库 所有版本在应用程序级等级文件中都相同 那么为什么我收到此
  • RecyclerView onItemClickListener 不工作

    我正在研究回收视图并尝试对 recyclerview 的每个项目使用点击侦听器界面 这是我的活动课程 public class LegacyHomeActivity extends ActivityBaseDrawer private Li
  • 如何在使用 Web 服务时获取会话对象?

    如何在使用 Web 服务时获取会话对象 服务在两个程序之间调用 如何在使用 Web 服务时获取用户会话对象 不可能使用请求对象获取会话 因为当我们谈论服务时不会有请求或响应 如果您正在与JAX WS https jax ws dev jav
  • IntelliJ IDEA:忽略代码覆盖率中的琐碎方法

    在 IntelliJ IDEA 15 0 2 中 如何在测试覆盖率测量期间忽略琐碎的 getter 和 setter 琐碎方法 should be measure public void complex fancy interesting
  • 多少次函数调用会导致堆栈溢出

    你好 Android Java 开发者 当一个函数调用一个函数并且该函数调用另一个函数等等时 有多少次调用 堆栈长度 会让我陷入堆栈溢出 有一般经验法则吗 我问的原因是因为我现在对于我的 5 人纸牌游戏来说哪个更有效 设计明智 解决方案一
  • CellTables 和 css (GWT)

    有人可以帮我设置 CellTable 行的背景吗 拜托 我整晚都在努力做这件事 但一直失败 这是 让我发疯 我尝试过调用setRowStyles 但是那个 似乎不起作用 我读到你无法更改 设置样式后 CellTable 的样式 作为默认样式
  • 无法使用 jolokia 从 Kafka 提取 JMX 数据

    我已经在 centos 7 机器上安装了 Jolokia 并尝试使用 Jolokia 代理提取 Kafka 指标 并使用 Nagios 插件 check jmx4perl 与 Icinga 监控工具集成 以下是我遵循的配置步骤 步骤1 下载
  • 注意通知持续时间

    是否可以将抬头通知的持续时间设置为无限 现在它只显示 5 秒 已经尝试过不同的事情 例如更改类别 但持续时间始终为 5 秒 这是我的代码 Notification notification notificationBuilder setCa
  • JFrame 类型的方法 ... 未定义

    我正在尝试制作一个带有两个菜单列表的 gui 每个菜单列表有 3 个项目 我的问题是 当我单击某个项目时 出现错误 JFrame 类型的方法 displayList int AirplaneList 未定义 AirplaneControll
  • 使用 Maven 将值附加到文件中

    我想在文件末尾附加一个值 但我无法确定要使用哪个插件 例子 我要附加的值 myValue file value1 value2 myValue 追加后 我知道我可以使用 antrun plugin 来做到这一点 但是可以使用 Maven 插
  • 使用 Jsoup 选择没有类的 HTML 元素

    考虑一个像这样的 html 文档 div p p p p p class random class name p div 我们怎样才能选择所有p元素 但不包括p元素与random class name class Elements ps b
  • Eclipse IDE - 错误:构建路径指定执行环境 Java SE 1.7

    在 Eclipse 中 我收到一个错误 构建路径指定执行环境Java SE 1 7 工作区中没有安装与此环境严格兼容的 JRE 尝试这个 In Eclipse your project gt properties gt java build
  • 为什么 JDOM 的 getChild() 方法返回 null?

    我正在做一个关于 html 文档操作的项目 我想要现有 html 文档中的正文内容将其修改为新的 html 现在我正在使用 JDOM 我想在我的编码中使用 body 元素 为此 我在编码中使用了 getChild body 但它向我的程序返

随机推荐

  • Python 快速获取文件夹中的所有文件名,并保存到txt文件中

    下面的代码可以读取文件夹中的所有文件名 并记录到txt文件中 可以应用到如深度学习制作数据集等场景中 usr bin env python encoding utf 8 import os img path images img list
  • Windows防火墙阻止了远程调试

    问题 当调试数据库里的存储过程时提示 Windows防火墙当前阻止了远程调试 当接着打开SQL Server的时候提示 远程过程调用失败 解决办法 1 当遇到远程过程调试失败
  • windows下查看GPU使用率

    进入C Program Files NVIDIA Corporation NVSMI 在此处打开cmd 输入nvidia smi 第一行Driver Version 表示驱动是385 54 第二行中 第一行表示GPU序号 名字 Persis
  • python作业题

    1 输入三个坐标表示三角形的三个顶点 计算三角形的面积 import math x1 y1 x2 y2 x3 y3 eval input x1 y1 x2 y2 x3 y3 如果不在一条直线上就构成了三角形 if x1 x2 y1 y2 x
  • GMM-HMM在语音识别中的应用

    1 语音识别系统的基本结构 2 涉及算法 3 GMM高斯混合模型 3 1高斯混合模型的基本概念 高斯混合模型是指具有如下形式的概率分布模型 p y k 1k k y k p y arrowvert theta sum k 1 k alpha
  • docker redis单例安装

    环境 windows docker desktop 版本 19 03 12 1 下载redis的docker镜像 docker pull redis 6 0 8 2 设置docker共享目录 docker中的共享目录 即能将宿主的文件同步到
  • Pandas

    文章目录 1 什么是Pandas 2 Pandas的数据结构 2 1 Series 2 1 1 Series的创建 2 1 2 Series的属性 2 2 DataFrame 2 2 1 DataFrame的创建 2 2 2 DataFra
  • 在linux上odoo搭建

    一 配置Postgresql数据库 1 安装Postgresql root runner home sg os apt get install postgresql 2 配置postgresql 拷贝 var lib postgresql
  • Centos7五步安装Docker并解决docker官方镜像无法访问问题

    根据官方文档 https docs docker com install linux docker ce centos 搭建docker 1 卸载docker旧版本 sudo yum remove docker docker client
  • C++实现——小孩分糖果问题

    include
  • el-dialog组件实现可以拖拽移动功能

    面向百度编程的小白最近遇到一个el dialog实现拖拽移动的需求 翻了翻饿了么官网发现el dialog并没有关于这一块的属性方法 所以与大家分享一下有关的方法 首先新建一个js文件 directive js文件 用于详情对话框可移动 i
  • python4行代码实现九九乘法表

    九九乘法表是python的循环嵌套 两次利用range 相乘并输出 for i in range 1 10 for j in range 1 i 1 print sx s s j i i j end print
  • QThread线程的运行和退出

    关于QT退出线程 一直迷迷糊糊的 凑活着能用就行 出了问题总觉得莫名其妙 现在静下心来总结一下 感谢 QThread的用法 开启与退出 Qt QThread 这是我 见过解析最全面的一片文章 线程运行有两种方式 include
  • Python图像处理

    1 图像平滑 图像平滑是指受传感器和大气等因素的影响 遥感图像上会出现某些亮度变化过大的区域 或出现一些亮点 也称噪声 这种为了抑制噪声 使图像亮度趋于平缓的处理方法就是图像平滑 图像平滑实际上是低通滤波 平滑过程会导致图像边缘模糊化 图像
  • 关于FlashDB的应用-GD32F450上

    一 介绍 1 FlashDB是什么 是用于嵌入式的数据库存储 2 FlashDB谁整出来的 是armink 朱天龙 3 FlashDB依赖于什么 片内或者片外的Flash存储 FAL 4 FAL什么 FAL Flash Abstractio
  • 制作搭建宠物商城小程序,打造便捷的宠物购物体验

    随着宠物市场的不断发展 宠物商城小程序成为了满足宠物爱好者需求的重要工具 在现代社会 宠物已经成为人们生活中不可或缺的一部分 作为宠物爱好者 我们对于宠物食品 用品 医疗保健品等需求日益增长 而宠物商城小程序则为我们提供了一个便捷高效的购物
  • 在Matlab2018b中配置MinGW-w64 C/C++ 编译器

    在Matlab2018b跑代码时 输入mex setup 报错 错误使用 mex 未找到支持的编译器 您可以安装免费提供的 MinGW w64 C C 编译器 在 https jmeubank github io tdm gcc artic
  • 最详细的堆排序---排序算法,思路清晰动图讲解,五分钟搞懂!

    堆排序 同步微信公众号乐享Coding 欢迎你的关注 介绍 利用堆这种数据结构而设计的一种排序算法 堆排序是一种选择排序 它的最坏 最好 平均时间复杂度均为O nlogn 它是不稳定排序 对于堆排序 难点在于二叉树的顺序数组储存到大顶堆 小
  • psm倾向得分匹配法举例_基于R:使用“lalonde”数据集探讨倾向值匹配方法(PSM)的效果...

    1 导言 PSM 即倾向值匹配法 是处理社会研究反事实问题 以得到因果效应的重要技术之一 胡安宁 2020 概而言之 即先将多维的混淆变量降维成单维的倾向值 然后让接受实验处理的个体与未接受实验处理的个体基于倾向值进行匹配 当倾向值相同时
  • java——equals(),hashCode()重写与不重写区别

    1 总结 1 两个obj 如果equals 相等 hashCode 一定相等 2 两个obj 如果hashCode 相等 equals 不一定相等 2 不重写equals hashCode 不重写的时候 比较两个对象是否 相等 默认跟 效果