是否有一个HashMap类(或Map接口)的实现,允许我使用交替的hashcode和equals操作...类似于使用Collections.sort(list,comparator)中的Comparator以多种方式对相同类型的集合进行排序。
如果可能的话,我想避免创建一个提供所需hashcode和equals操作的密钥 Package 器。
在我的情况下,其中一个场景,为什么我需要这样的东西:
在我的Web应用程序中,对于每个请求,我加载位置/ISP和其他数据。在代码的不同部分(在我的服务和存储库层),我已经“最小化”了特定于其需求的缓存。
下面是一个简化的代码示例:
class GeoIpData{
private String countryName;
private String state;
private String city;
private String isp;
@Override
public int hashCode() {
//countryName hashCode
//state hashCode
//city hashCode
//isp hashCode
}
@Override
public boolean equals(Object obj) {
// compare countryName
// compare state
// compare city
// compare isp
}
}
Map<GeoIpData,#Type1> fullCache = ... //This cache needs to be unique per countryName,state,city and isp
Map<GeoIpData,#Type2> countryCache = ... //This cache needs to be unique per countryName
Map<GeoIpData,#Type2> ispCache = ... //This cache needs to be unique per countryName,isp
为了实现这一点,上面的3个Map需要3个不同的hashcode和equals方法。
fullCache:
hashCode -> GeoIpData.hashCode();
equals -> GeoIpData.equals(Object obj);
countryCache:
hashCode -> {countryName hashCode }
equals -> {compare countryName }
ispCache:
hashCode -> {countryName hashCode & isp hashCode }
equals -> {compare countryName & compare isp hashCode }
3条答案
按热度按时间rggaifut1#
GNU Trove允许您为TCustomHashMap提供特定的TObjectHashingStrategy和您自己的hash和equals函数。
tp5buhyn2#
最初的Java API将
equals
/hashCode
行为限制为类型(类),因为它们当时没有lambda表达式。为了重用现有的API /实现-制作临时密钥:
或 Package :
并为key编写helper构造函数:
dfuffjeb3#
有很多非并发的第三方哈希Map,其中一些支持自定义equals和hashCode,就像Mikhail的回答中提到的那样。
这里有一个技巧,允许你使用标准的ConcurrentHashMap和自定义的equals/hashCode实现。它使用一个线程局部变量来传达在任何给定的时间点应该使用哪些equals/hashCode实现键。
首先是一个装饰器,用于将功能添加到任何
ConcurrentMap
实现中:下面是一个关于如何使用相同的键对象示例的例子a)使用默认的equals/hashCode,b)使用自定义的:
输出如下: