我想知道一个像常规HashMap / Hashtable一样工作的Map,除了它需要一个返回哈希码并执行相等性测试而不是让HashMap使用Object.hashCode / equals的函数。
我无法使用TreeMap,因为对象没有实现Comparable,并且没有稳定的方法来处理不等对象的情况。无法使用System.identityHashCode,因为对于不相等的对象可能会发生冲突。
理想情况下,如果Map以类似的方式获取函数,可以将自定义Comparator提供给TreeMap而不是让TreeMap将参数转换为Comparable,那将是很好的。
解决这个问题的唯一方法是包装每个密钥并让包装器执行自定义哈希/等于但是肯定会更好地解决这个问题。
答案 0 :(得分:9)
您是否考虑过想要缓存的对象的简单包装?
class Wrapper {
YourObject object;
public boolean equals(Object someOther) {
...
}
public int hashCode() {
}
}
答案 1 :(得分:0)
使用TreeMap时,地图中的对象不需要实现Comparable。
答案 2 :(得分:0)
Plume-lib的WeakHasherMap做你想做的事:它的构造函数将Hasher对象作为参数,它定义了hashCode()
方法和equals()
方法。
(这在您撰写问题时存在,但我现在只注意到您的问题,在您提出问题后的6。5年。)
编辑:我是plume-lib的维护者。
答案 3 :(得分:0)
其他答案表明,用具有所需hashCode和equals的对象包装对象通常是最好的方法。如果在极少数情况下,您希望函数使用Object上的原始equals和hashCode实现,则实际上是针对该用例的IdentityHashMap。但是,我很欣赏您想要的功能可能比这还重要。
答案 4 :(得分:-1)
I proposed an interface for such a "hash function" some time ago.
现在你需要采用哈希映射的任何实现(例如,OpenJDK是GPL)并通过调用此哈希对象来修改hashCode()
和.equals()
的所有调用。我做了一次(许多年前),但它没有发表。