java - Java中基于相等性生成Hash码

标签 java

我将获取数据库中存在的对象列表(Employee实体类)到List1。我将从 Excel 工作表中读取对象列表来表示 List2。

Employee实体类将具有多个属性,例如firstName、middleName、lastName、age、phoneNumber、address、SSN、employeeId等。

基于以下任一条件,List1 中的对象 o1 将等于 List2 中的对象 o2: 1. o1 和o2 的firstName、middleName 和lastName 相等。 2. o1和o2的SSN相等。 3、o1和o2的employeeId相等。

如果基于上述任一条件,o1 和 o2 相等,则意味着应将 o2 的地址、电话号码等属性更新为 o1。 如果 o1 != o2,则在数据库中创建一条新记录。 上述可以通过对这些列表进行多次迭代来实现。

但我正在寻找一种设计来构造 2 个 HashMap map1 和 map2,一个用于现有记录(List1),一个用于 Excel 工作表(List2)中的新记录。

HashMap 的键应该是 [firstName、middleName、lastName] 或 [SSN] 或 [employeeId] 的 HashCode,值将是整个对象。 这样我就可以从map1中取出Key,并在map2中通过Key查找,如果存在,则将map2中的其他属性更新到map1并将其保存到数据库中。

不确定如何构建此 HashCode 方法。是否可能或违反标准?

最佳答案

这里唯一的两个标准是:

  1. 如果对象相等,它们应该具有相同的hashCode(仅在这个方向) - 这称为“equals-hashcode 合约”。
  2. hashCode 应仅依赖于对象的字段。

在这种情况下,不可能根据上述规则构建正确的 hashCode

因为你可以有3个人:

  • 第一个和第二个将具有相同的名字、中间名和姓氏
  • 第二个和第三个将具有相同的 SSN,但名称不同

所有这 3 个人都应该返回相同的 hashCode,因为他们相等。但它们的 hashCode 应该仅依赖于字段。 结论是 - 在这种情况下,hashCode 将取决于比较的上下文,而不仅仅是字段。出了什么问题。

关于java - Java中基于相等性生成Hash码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339192/

相关文章:

java - 如何获取 HashMap<String, Integer> 中可能值的列表?

java - 如何使用rowkey的特定部分扫描HBase?

java - 如何从数据库访问所有用户?

java - 如何检查 InetAddress 是使用主机名还是 IP 地址创建的?

c# - 从 NZMG 到经纬度的转换

java.io.IOException : Could not read footer for file FileStatus when trying to read parquet file from Spark cluster from IBM Cloud Object Storage

java - Eclipse 给出关于不返回整数的错误

java - 我可以从没有显式变量的 lambda 表达式创建 Comparator 对象吗?

Java-选项卡上的按键监听器不起作用

java - hibernate +Spring MVC : external objects library