【问题标题】:Generating Hash code based on Equality in JavaJava中基于等式生成Hash码
【发布时间】:2019-12-11 19:58:07
【问题描述】:

我会将数据库中存在的对象(员工实体类)列表提取到 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 方法。有可能还是会违反标准?

【问题讨论】:

  • 在 HashMap 中使用 hashCode 作为键并不是一个好主意。您可以使用 HashSet 代替所有后果。最好将您的数据结构作为相关代码提供。

标签: java


【解决方案1】:

这里仅有的两个标准是:

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

在这种情况下,无法按照上述规则构建hashCode

因为你可以有 3 个人:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多