首页 > 解决方案 > Java中基于等式生成Hash码

问题描述

我会将数据库中存在的对象(员工实体类)列表提取到 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 个 HashMaps map1 和 map2,一个用于现有记录(List1),一个用于 excel 表(List2)中的新记录。

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

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

标签: java

解决方案


这里仅有的两个标准是:

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

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

因为你可以有3个人:

  • 1st 和 2nd 将具有相同的 firstName、middleName 和 lastName
  • 2nd 和 3rd 将具有相同的 SSN 但名称不同

所有这三个人都应该返回相同的hashCode,因为他们是equal。但他们hashCode应该只依赖于领域。结论是 - 在这种情况下hashCode,将取决于比较的上下文,而不仅仅是字段。怎么了。


推荐阅读