在java中是否有可能制作类似比较器的东西,但用于实现自定义 equals() 和 hashCode()

2022-08-31 16:14:26

我有一个对象数组,我想将其与另一个对象数组连接起来,但具有相同id的对象除外。该对象在系统中的许多位置使用,并且没有实现哈希代码或等于。所以我不想实现和,因为我害怕在系统中使用该对象的某个地方破坏某些东西,而我对此一无所知。hashCode()equals()

我想把所有这些对象放在一个集合中,但以某种方式使对象使用自定义和.类似于习俗,但为了平等。hashCode()equals()Comparator


答案 1

是的,可以做这样的事情。(人们已经做到了。但它不允许您将对象放入 、 等中。这是因为标准集合类期望关键对象本身提供 and 方法。(这就是它们被设计的工作方式...HashMapHashSetequalshashCode

选择:

  1. 实现一个包装类,该类保存实类的实例,并提供其自己的 和 的实现。equalshashCode

  2. 实现您自己的基于哈希表的类,该类可以使用“可哈希”对象来提供相等和哈希码功能。

  3. 咬紧牙关,在相关类上实现和覆盖。equalshashCode

实际上,第三个选项可能是最好的,因为您的代码库很可能需要使用这些对象相等的含义的一致概念。还有其他一些事情表明您的代码需要彻底修改。例如,它当前使用对象数组而不是 Set 实现来表示显然应该是集合的内容。

另一方面,当前实现可能有一些真实(或想象)的性能原因;例如,减少内存使用量。在这种情况下,您可能应该编写一堆帮助器方法来执行操作,例如连接表示为数组的2个集合。


答案 2

90%的情况下,当用户想要等价关系时,已经有一个更直接的解决方案。您想仅基于ids删除一堆内容吗?你能把它们都放到一个地图上,以ids为键,然后得到它的集合吗?values()


推荐