Java 1.7 重写 hashCode() 的行为不符合我的预期

2023-12-12

我有一个类,我重写了 hashCode 方法和 equals 方法。 equals 方法的行为符合我的预期,但是 hashCode 方法的行为似乎并不符合我的预期。我假设我的期望是不正确的,但不确定为什么。以下是重写的方法:

public class Car extends SomeBaseClass implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String carName;
private String carModel;
private String displayTextCar;


public boolean equals(Car car)
{
    return (getCarName().equals(car.getCarName())  && getCarModel().equals(car.getCarModel()));
}

public int hashCode()
{
    return (this.getCarName() + this.getCarModel()).hashCode();

} 

现在我有一个测试类,其中创建两个汽车对象,并调用 equals 方法,然后将汽车的每个实例放入 HashMap 中。我将每个实例设置为具有相同的汽车名称和型号,并且调用 equals 方法实际上返回 true。然而,即使每个实例返回相同的 hashCode,当我将它们添加到 HashMap 时,它会在 Map 中保留两个对象,而我希望第二个 put 替换映射中的第一个对象???以下是测试类的内容:

HashMap<Car,String> testMap;

Car testCar1 = new Car();
testCar1.setCarName("DaveCar");
testCar1.setCarModel("DaveModelTest");
System.out.println("Car Hash 1: " + testCar1.hashCode());

Car testCar2 = new Car();
testCar2.setCarName("DaveCar");
testCar2.setCarModel("DaveModelTest");
System.out.println("Car Hash 2: " + testCar2.hashCode());

//hashCodes prints identical numbers

System.out.println("Car 1 equal Car 2 ?? " + testCar1.equals(testCar2));
//returns true

testMap.put(testCar1, "3");     
testMap.put(testCar2, "16");

System.out.println("Map size is " + testMap.size());
//I would expect the size to be 1 here, but it's in fact 2.

所以这对我来说似乎不正确,我自然地在这里留下了一些代码,但这是基本原理。希望有人能指出我这里出错的地方。请注意,我确实使用 Eclipse 生成 hashCode 和 equals 方法,并且工作正常,但令我烦恼的是,我的 hashCode 实现并未按预期工作,即使两个对象似乎返回了相同的 hashCode 值。感谢任何人的意见。


问题是你提供了错误的equals: 它应该是equals(Object), not equals(Car).

本质上,您已经提供了overload而不是override, so HashMap一直打电话给equals来自基类。

解决这个问题很简单:添加一个执行强制转换的覆盖,并调用equals你写的方法,像这样:

@Override
public boolean equals(Object other) {
    return (other instanceof Car) && equals((Car)other);
}

注意使用@Override注解。它可以帮助 Java 自动发现此类问题。

注意:解决这个问题后,请考虑实施您的hashCode以更“节俭”的方式。而不是创造一个一次性的(this.getCarName() + this.getCarModel())string 只是为了获取其哈希码,可以考虑重写方法如下:

public int hashCode() {
    return 31*getCarName().hashCode() + getCarModel().hashCode();
}

或者在 Java 1.7+ 中你可以这样写

public int hashCode() { // Thanks, fge, for a nice improvement!
    return Objects.hash(carName, carModel);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 1.7 重写 hashCode() 的行为不符合我的预期 的相关文章

  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • Keras减肥

    我的模型有两个输出层 年龄和性别预测层 我想为每个输出层的损失分配不同的权重值 我有以下代码行来执行此操作 model compile loss losses mean squared error losses categorical cr
  • 为什么 FormsAuthentication 的 requireSSL 属性默认为 false!

    注意 这不是与 RequireSSL 属性相关的 ASP NET MVC 问题 那是完全不同的 只是名字相同 ASP NET Forms 身份验证具有需要SSL属性要求 ASP NET 成员资格的身份验证 cookie 只能通过 SSL 发
  • Delegate.Invoke 和 Delegate() 之间的区别

    delegate void DelegateTest DelegateTest delTest 打电话有什么区别delTest Invoke and delTest 两者都会在当前线程上执行委托 对吗 The delTest form 是一
  • 如何使用决策者终止 Spring Batch Split Flow 中的步骤

    我在 Spring Batch 中遇到了以下设计缺陷 步骤必须具有 Next 属性 除非它是最后一个步骤或拆分流的最后一个步骤 Decider 块必须处理 Decider 返回的所有情况 因此 在 Split Flow 中 最后一个 Ste
  • 捆绑了依赖项的 JavaFX jar

    我刚刚提出了一个关于使用javafxpackager制作JavaFX jar的问题 你可以看看here 我的问题是我无法在清单中包含类路径 好吧 当我等待答案时 我尝试了maven antrun plugin反而 它工作得很好 我可以使用依
  • 如何获取struts标签中的JSP scriptlet值

    这是我的代码 如果我执行以下操作 我将不会获得该值
  • 管道“cd”或“popd”输出会阻止更改目录吗?

    我明白 自从 为命令启动一个新进程after管道 任何形式的 shell 命令cmd cd newdir where cmd不更改当前工作目录 将保持原始进程的工作目录不变 更不用说这有点愚蠢了 因为cd不从 stdin 读取输入 但是 在
  • Google Apps 脚本按钮:我可以分配未附加到工作表的“全局”脚本吗?

    我有一个脚本 想将其分配给多个不同电子表格上的按钮 如果我在电子表格上创建一个按钮并引用存储在 Google 驱动器上另一个父文件夹中的脚本 我会收到错误Script function myScript could not be found
  • @autoreleasepool 没有 ARC?

    我是 Xcode 4 2 的新手 还没有完全熟悉 ARC 然而 我确实读到 autoreleasepool 取代了自动释放池的手动使用 并在幕后做了一些特殊的魔法来与 ARC 很好地配合 然而 当我在 Xcode 4 2 中启动一个新项目时
  • 同步动态加载 JavaScript

    我正在使用模块模式 我想做的一件事是动态包含一个外部 JavaScript 文件 执行该文件 然后在return 我的模块 我不知道如何轻松做到这一点 是否有执行伪同步外部脚本加载的标准方法 function myModule var ta
  • 奥利奥:广播接收器不工作

    每当用户拨打新电话时 我试图在我的应用程序上获取通知触发器 我正在我的活动中注册接收器并在 onDestroy 方法中销毁它 以下是注册的代码片段 registerReceiver inComingCall new IncomingCall
  • 在 JavaScript 中序列化/反序列化对象的最佳方法?

    我的应用程序中有许多 JavaScript 对象 例如 function Person age this age age this isOld function return this age gt 60 before serialize
  • 获取 API post XML 请求错误

    我没能做到fetch发布请求 它返回一个400 bad request error fetch http 192 168 1 6 49152 ctl RenderingControl method POST headers SOAPActi
  • 箭头函数比 v8 中的普通独立函数声明更快(性能更高、更轻)吗?

    我问这个问题是因为我和我的同事在编码风格上存在争议 因为他更喜欢箭头函数声明 const sum a b gt a b 我更喜欢旧式的独立函数声明 function sum a b return a b 我的观点是 旧式代码更具可读性 您可
  • 下载进度状态,从 Google 云端硬盘下载文件时?

    我可以从 Google 云端硬盘下载文件 但我想知道下载进度 谁能告诉我该怎么做 我已经尝试过这样下载文件 NSString downloadURL self driveFiles objectAtIndex indexPath row d
  • 源文件与构建模块时不同

    这真让我抓狂 我有一个相当大的项目正在尝试修改 我早些时候注意到当我输入时DbCommand Visual Studio没有对其进行任何语法高亮 我正在使用usingSystem Data Common 尽管没有突出显示任何内容 该项目似乎
  • 如何使用 Inno Setup 创建一个安装程序来提取 .rar 存档的内容?

    我想在 Inno Setup 中创建一个安装程序 它提取预先创建的内容Data rar档案 我的意思是它应该将 rar 存档的内容视为应用程序的文件和文件夹 通过 Inno Setup 使用外部提取实用程序的通用方法 创建档案 将存档嵌入到
  • Material-UI LinearProgress 栏不起作用

    我有一个简单的文件上传实用程序 我正在使用它反应 dropzone 并结合我想使用material ui LinearProgress bar来显示进度 下面显示的是我创建的组件 它呈现文件上传实用程序以及 LinearProgress 栏
  • 在 React 项目上运行 NPM start 后出错

    我已将项目从以前的计算机复制到当前的计算机 跑步后npm install And npm start我的终端给出了这个错误 sh 反应脚本 找不到命令npm 错误 文件shnpm 错误 代码 生命周期npm 错误 错误信息npm 错误 系统
  • Java 1.7 重写 hashCode() 的行为不符合我的预期

    我有一个类 我重写了 hashCode 方法和 equals 方法 equals 方法的行为符合我的预期 但是 hashCode 方法的行为似乎并不符合我的预期 我假设我的期望是不正确的 但不确定为什么 以下是重写的方法 public cl