Java:具有doubleKey类型的Map,如何制作正确的hashCode()?

标签 java dictionary equals hashcode multikey

我有一个 MultiKey 对象作为 Map 的键。

key 由名称(字符串)和 ID(整数)组成。

必须履行以下契约(Contract): 如果两个键的名称或 ID 相等,则键必须相等。

我如何实现 hashCode() 函数才能不违反此契约(Contract)?这可能吗?

实现 equals 很容易......我只是输入:

if (name.equals(other.name) || id == other.id)
    return true;

但是这行不通,因为hashMap只使用hashCode()而不关心equals()...

示例:

Map A = [ ("tom",1)=TOMAS, ("eli",2)=ELIAS ]

A.get(new Key("tom",0))    should return TOMAS
A.get(new Key("",1))       should return TOMAS
A.get(new Key("eli",2))    should return ELIAS
...

最佳答案

我能想到的唯一方法是构建一个 TreeSet 集合来缓存键的 hashCode。然后使用遇到的第一个 equals 值作为当前执行的 hashCode 值。与此相关的问题:
A。如果有许多不同的键,则可能会使用大量额外的内存。
b. hashCode 值在程序的多次执行中不一定保持一致。
C。如果是多线程,则需要针对缓存的 hashCode 进行同步。

如果您这样做,则可以像往常一样简单地结合名称和 id 生成 hashCode。

关于Java:具有doubleKey类型的Map,如何制作正确的hashCode()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773944/

相关文章:

c++ - 是否有更好(更有效)的方法来查找是否可以从另一个字符串的字符形成一个字符串?

css - 两列等高只有 css(不显示 : table, table-row, table-cell)

java - 正则表达式\w字符类和等号

java - 使用 HTML 的 out.print 时如何打印资源的正确路径

Java 按年龄划分颜色

java - 实现 DFA 的最佳方法有哪些?

Python Folium Choropleth map KeyError : None

java - Java 中的正则表达式映射实现

java - 我可以只使用关键字段来检查是否相等吗?我可以通过子类使用 equals 吗?

java - 如何在运行时更改注释/Hibernate 验证规则?