集合在java中是否可以制作类似Comparator的东西,但要实现自定义equals()和hashCode()
我有一个对象数组,我想将它与另一个对象数组连接起来,除了具有相同id的对象。这些对象在系统中的许多地方都使用,并且没有实现哈希代码或相等值。所以我不想实现hashCode()
和equals()
,因为我害怕破坏系统中使用这些对象的某个地方,我对此一无所知
我想把所有这些对象放在一个集合中,但不知何故,让这些对象使用自定义hashCode()
和equals()
。类似于custom Comparator
,但适用于equals
# 1 楼答案
当然,您可以创建一些提供等式比较和哈希代码的外部对象。但是Java的内置集合不使用这样的对象进行比较/查找
我曾经在我的软件包集合中创建过这样的界面(刚刚翻译成英文):
然后我有一组接口
CustomCollection
、CustomSet
、CustomList
、CustomMap
等等。这些接口的定义与java.util
中的接口类似,但对所有方法都使用这种等价关系,而不是Object.equals
给出的内置关系。我也有一些默认实现:# 2 楼答案
90%的时候,当用户想要一个等价关系时,已经有了一个更直接的解决方案。你想只基于ID消除一堆东西的重复吗?你能把它们都放到一个以ID为键的映射中,然后得到它的
values()
集合吗# 3 楼答案
HashingStrategy是您正在寻找的概念。它是一个策略接口,允许您定义equals和hashcode的自定义实现
正如其他人所指出的,不能将
HashingStrategy
与内置的HashSet
或HashMap
一起使用Eclipse Collections包括一个名为UnifiedSetWithHashingStrategy
的集合和一个名为UnifiedMapWithHashingStrategy
的映射让我们看一个例子。这里有一个简单的
Data
类,我们可以在UnifiedSetWithHashingStrategy
中使用下面是你如何设置一个
UnifiedSetWithHashingStrategy
并使用它为什么不直接使用
Map
UnifiedSetWithHashingStrategy
使用了UnifiedMap
的一半内存,以及HashMap
的四分之一内存。有时你没有一个方便的键,必须创建一个合成键,比如元组。这会浪费更多的内存我们如何进行查找?记住,集合有
contains()
,但没有get()
UnifiedSetWithHashingStrategy
除了MutableSet
之外,还实现了Pool
,因此它还实现了get()
的一种形式注意:我是Eclipse集合的提交者