当我重写 equals() 方法时,为什么要重写 hashCode() ?

2023-12-11

好的,我从很多地方和来源听说,每当我重写 equals() 方法时,我也需要重写 hashCode() 方法。但考虑下面的代码

package test;

public class MyCustomObject {

    int intVal1;
    int intVal2;

    public MyCustomObject(int val1, int val2){
        intVal1 = val1;
        intVal2 = val2;
    }

    public boolean equals(Object obj){
        return (((MyCustomObject)obj).intVal1 == this.intVal1) && 
                (((MyCustomObject)obj).intVal2 == this.intVal2);
    }

    public static void main(String a[]){
        MyCustomObject m1 = new MyCustomObject(3,5);
        MyCustomObject m2 = new MyCustomObject(3,5);
        MyCustomObject m3 = new MyCustomObject(4,5);

        System.out.println(m1.equals(m2));
        System.out.println(m1.equals(m3));
    }
}

这里的输出是 true, false 正是我想要的,我根本不关心重写 hashCode() 方法。这意味着 hashCode() 覆盖是一种选择,而不是像大家所说的那样是强制性的。

我想要第二次确认。


它适合您,因为您的代码不使用任何需要的功能(HashMap、HashTable)hashCode() API.

但是,您不知道您的类(可能不是一次性编写的)稍后是否会在确实使用其对象作为哈希键的代码中被调用,在这种情况下,事情将会受到影响。

根据对象类的文档:

hashCode的通用约定是:

  • 每当在 Java 应用程序执行期间对同一对象多次调用 hashCode 方法时,只要对象上的 equals 比较中使用的信息没有被修改,hashCode 方法就必须始终返回相同的整数。从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。

  • 如果根据 equals(Object) 方法两个对象相等,则对这两个对象调用 hashCode 方法必须产生相同的整数结果.

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

当我重写 equals() 方法时,为什么要重写 hashCode() ? 的相关文章

  • 为什么 JavaFX API 不包含在 Java 8 J2SE 中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有谁知道为什么 JavaFX 8 仍然不是即将推出的 Java 8 中的日常 J2SE API 显示所有 Java 组件的技术图清楚地将 Jav
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 最终字段可能尚未/已经初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何处理抛出检查异常的静态最终字段初始值设定项 https stackoverflow com questions 1866770 how to handle a static final field
  • Java HashMap 嵌套泛型与通配符

    我正在尝试创建包含自定义类的不同子类的哈希集的哈希映射值的哈希映射 如下所示 HashMap
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 为什么这个动作不抽象? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我很难理解为什么一个类中的一个操作是抽象的 而另一个类中的操作不是 源代码1 编译时出错 https gyazo com cd3c
  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • 限制 JPQL 中的结果数量

    如何限制从数据库检索结果的数量 select e from Entity e I need only 10 results for instance 您可以尝试像这样给出 10 个要显式获取的结果 entityManager createQ
  • Java时间转正常格式

    我有 Java 时间1380822000000 我想转换为我可以阅读的内容 import java util Date object Ws1 val a new Date 1380822000000 toString 导致异常 warnin
  • 使用 Hibernate Criteria 过滤 Map 中的键和值

    我有以下持久类 public class Code ElementCollection targetClass CodeValue class MapKeyClass CodeProperty class JoinTable name co
  • 如何修复maven错误JAVA_HOME环境变量未正确定义

    当我在虚拟环境中检查maven的版本时 出现以下错误 The JAVA HOME environment variable is not defined correctly This environment variable is need
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • 如何加载图像文件到ImageView?

    我试图在从文件选择器中选择图像文件后立即显示该图像文件 文件选择器仅限于 png 和 jpg 文件 所选文件存储在文件类型的变量中 为此 我设置了一个 ImageView 我希望用这个新文件设置图像 唯一的问题是它的类型是文件而不是图像 如
  • 将 PropertyPlaceholderConfigurer 中的所有属性注入到 bean 中

    我有一个PropertyPlaceholderConfigurer加载多个属性文件 我想通过配置 XML 将合并的属性映射注入到 Spring Bean 中 我可以这样做以及如何做 您只需创建一个属性 bean 并将其用于您的Propert
  • 通过向上转换将 Java.sql.date 转换为 Java.util.date 安全吗?

    java sql date 扩展了 java util date 那么通过将 java sql date 转换为 java util date 是否可以在两者之间进行转换 或者有其他方法可以转换它们吗 您不一定需要强制转换 您可以将 SQL
  • while循环只执行一次

    我很难弄清楚为什么 while 循环实际上不会循环 它运行一次并停止 import java util public class mileskm public static void main String args Scanner inp

随机推荐

  • 使用 broom 包整理地图时保留区域名称

    我正在使用栅格包中的 getData 函数来检索阿根廷地图 我想使用 ggplot2 绘制生成的地图 因此我使用 broom 包中的 tidy 函数转换为数据框 这工作正常 但我不知道如何保留联邦地区的名称 以便我可以在地图上使用它们 这是
  • 导入旧的 ES5 模块以在 ReactJS 组件中使用

    我正在尝试在新的 ReactJS 应用程序中使用 ES5 模块 并且我正在努力理解如何正确导入该模块 以便可以找到并执行其中的主要函数 我正在加载模块 import air datepicker 我知道我在这里做错了 而且对于一个没有适当导
  • Python 并排带有颜色的 matplotlib 箱线图

    我按照这个例子link关于如何创建带有颜色的箱线图 我一直在尝试不同的方法来将这些箱线图分开在两个不同的位置 而不是让它们重叠 但无济于事 如果我为它们指定不同的位置 它们将保持在 bp2 位置 如何将这两个箱线图并排放置 import m
  • 如何在同一个消费者组中运行两个控制台消费者?

    当我运行两个具有完全相同属性的 Kafka console consumers 实例 使用默认的 config consumer properties 时 我在两个实例上收到相同的消息 bin kafka console consumer
  • 使用 VBA 将 url 发送到活动 IE 窗口

    我正在使用 VBA 并在 Excel 中创建宏以向 IE 浏览器窗口发送信息或从 IE 浏览器窗口发送信息 我一直在使用 AppActivate 来关注某个 IE 页面 使用它的标题 效果很好 使用 SendKeys 将信息发送回浏览器并没
  • 如何使用 jquery if else 语句切换类?

    我想使用 jquery If Else 语句针对指定条件切换类 我的 Html 带有默认 cssclass horizontal div class my item horizontal div 现在我怎样才能在之间洗牌我的CSS类hori
  • Phonegap:安装适用于 iOS 的 BarcodeScanner 时出错

    当我尝试安装 iOS 版 BarcodeScanner 插件时 plugman install platform ios project Users amarruffo Documents Projects phonegap barcode
  • 如何在ggplot中标记堆叠直方图

    我正在尝试将相应的标签添加到直方图中条形图中的颜色 这是一个可重现的代码 ggplot aes displ data mpg geom histogram aes fill class binwidth 1 col black 此代码给出了
  • 无法使用“-”破折号访问 JSON 属性 [重复]

    这个问题在这里已经有答案了 当字符串具有破折号字符时 我无法从 json 对象检索值 profile id 1234 user id 6789 如果我尝试引用解析的jsonObj profile id它返回ReferenceError id
  • ASP.Net Core 3 远程证书在 MacO 上无效

    当我尝试使用 Identityserver4 调用 API 方法时 我之前在 Windows 上尝试过 但它仅在 Mac OS 中工作正常 我遇到了这个问题 我不知道发生了什么以及如何解决它 我可以访问 https localhost 60
  • C 中布尔表达式的返回值

    由于不值得一提的原因 我想知道布尔表达式是否有标准定义值 例如 int foo return bar gt 5 背景是我担心我们的团队将 TRUE 定义为与 1 不同的东西 并且我担心有人可能会这样做 if foo TRUE do stuf
  • ggplot2根据数据值填充颜色

    我希望能够根据数据框中存储的值设置 ggplot 填充颜色 下面的代码 几乎 是我想要做的 除了我不只是使用 fill MyColor 我希望代码实际使用 MyColor 字段中的 RRGGBB 十六进制值 df data frame An
  • 模拟器错误 UnparseableJsonResponse(“找不到字段。”)

    我已在 DialogFlow 控制台中使用 webhook 成功测试了应用程序的前几个意图 但在模拟器中进行测试时出现以下错误 UnparseableJsonResponse API 版本 2 无法解析 JSON 响应 带有 INVALID
  • 使用 CMake 在同一解决方案中创建 C# 和 C++/CLR 项目(CMake 面向 Visual Studio)

    我想使用 CMake 在 MSVC 中创建一个解决方案 该解决方案具有两个项目 在 CMake 词汇中 一个 C 执行程序和一个 C CLR 库 我怎样才能做到这一点 我发现的所有示例都是关于 CMake 中的一种类型的项目 全部为 C 或
  • 检查哪些程序正在播放音频?

    我正在制作一个程序 我想找到正在播放音频的程序并将其静音 这样您听到的都是我的 这是程序的一个选项 没有恶意 我查了一下 似乎找不到一种方法来检查哪些程序正在播放音频 就像 Windows 一样 我没有任何尝试此操作的代码示例 因为 id
  • file_get_contents() 给我 403 Forbidden

    我有一个合作伙伴创建了一些内容供我抓取 我可以使用浏览器访问该页面 但是当尝试使用file get contents 我得到一个403 forbidden 我尝试过使用stream context create 但这没有帮助 可能是因为我不
  • onUpdate() intilized 变量在 widget 类的 onReceive 中为 null

    我在 onUpdate 方法中初始化一个变量 然后调用 onReceive 函数 该函数运行良好 但无法访问 onUpdate 方法中设置的变量 这是为什么 这些变量是字符串变量并且被声明为公共的 我错过了什么吗 public class
  • MySQL 5.6 中 json_extract 不可用时,如何从 JSON 字段中进行选择?

    如果我的行有一个varchar具有以下值 1 2 3 如果我需要该值包含其中一个数字 2 或 3 我该如何选择整行 正如你所说 你使用的是 MySQL 5 6 所以JSON EXTRACT 功能不可用 我推荐的唯一选择是 升级到 MySQL
  • 如何查看包含 git 暂存更改的文件

    git diff staged 允许您查看 HEAD 和暂存更改之间的更改 如果我要提交暂存的更改 如何查看 HEAD 中存在的完整文件 如何查看其中的特定行子集 您可以使用以下命令查看文件的暂存版本 git cat file p FILE
  • 当我重写 equals() 方法时,为什么要重写 hashCode() ?

    好的 我从很多地方和来源听说 每当我重写 equals 方法时 我也需要重写 hashCode 方法 但考虑下面的代码 package test public class MyCustomObject int intVal1 int int