【发布时间】:2011-03-27 23:31:27
【问题描述】:
我想知道一个像常规 HashMap/Hashtable 一样工作的 Map,除了它需要一个返回哈希码并执行相等测试的函数,而不是让 HashMap 使用 Object.hashCode/equals。
我不能使用 TreeMap 因为对象没有实现 Comparable 并且没有稳定的方法来处理不相等对象的情况。不能使用 System.identityHashCode,因为不相等的对象可能会发生冲突。
理想情况下,如果 Map 以类似的方式采用一个函数,可以为 TreeMap 提供自定义 Comparator 而不是让 TreeMap 将参数转换为 Comparable,那将是很棒的。
解决此问题的唯一方法是包装每个密钥并让包装器执行自定义散列/等于,但肯定有更好的方法。
【问题讨论】:
-
“不能使用 System.identityHashCode,因为不相等的对象可能会发生冲突。”这几乎是哈希表的一部分。哈希冲突确实发生在每个哈希表实现中。
-
对象都是同一类型吗?让他们实施 Comparable 是否有障碍?我想可以通过子类化 HashMap 和覆盖函数并传入对它们的函数引用来设置解决方案。但它似乎比实现 Comparable 要付出更多的努力。
-
这是一个多用途的 q,不幸的是,很多时候类不是你的,你不能改变它们,因此需要提供一个自定义函数来处理散列/相等测试。
-
@biziclop,是的,当然会发生哈希冲突,但我希望该函数也能处理相等性测试,这样我的函数就可以说明在计算哈希和相等性时什么是重要的。
-
只是想让你知道我有完全相同的问题。我目前正在使用具有自己的 equals() 和 hashCode() 方法的包装器对象,并且包装器占用了数百兆字节的堆内存。我打算采用 HashMap 的开源实现并对其进行调整。
标签: java