Java HashMap的自定义hashcode/equals操作
是否有HashMap类(或Map接口)的实现,允许我使用备用hashcode和equals操作。。。 类似于使用collections.sort(list,Comparator)中的Comparator以多种方式对相同类型的集合进行排序 如果可能的话,我希望避免创建一个密钥包装器来提供所需的hashcode和equals操作Java HashMap的自定义hashcode/equals操作,java,hashmap,equals,hashcode,overriding,Java,Hashmap,Equals,Hashcode,Overriding,是否有HashMap类(或Map接口)的实现,允许我使用备用hashcode和equals操作。。。 类似于使用collections.sort(list,Comparator)中的Comparator以多种方式对相同类型的集合进行排序 如果可能的话,我希望避免创建一个密钥包装器来提供所需的hashcode和equals操作 在我的例子中,我需要这样的场景之一: 在我的web应用程序中,对于每个请求,我都加载位置/ISP和其他数据。 在代码的不同部分(在我的服务层和存储库层中),我将特定于其需
在我的例子中,我需要这样的场景之一: 在我的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
允许您为TCustomHashMap提供特定的TObjectHashingStrategy和您自己的hash和equals函数。初始Java API绑定
equals
/hashCode
行为以键入(类),因为当时没有lambda
为了重用现有API/实现,请生成临时密钥:
public CountryKey {
private String country;
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CountryKey)) { return false; }
CountryKey that = (CountryKey) obj;
return this.country.equals(that.country);
}
@Override int hashCode() {
return country.hashCode();
}
}
或包装:
public CountryKey {
private GeoIpData holder;
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CountryKey)) { return false; }
CountryKey that = (CountryKey) obj;
return this.holder.getCountry().equals(that.holder.getCountry());
}
@Override int hashCode() {
return holder.getCountry().hashCode();
}
}
并为键编写帮助器构造函数:
public class GeoIpData {
public CountryKey buildCountryKey() {
return new CountryKey(this.country);
}
}
你好“Noofz”谢谢你的建议,让我先做一些基准测试。。。您以前有没有使用过这个,如果有,它在多线程环境中是如何工作的?cache.get(…)操作每秒执行5000到30000次,并且可能会增加一倍以上。不,实际上我没有在如此大的预确定下使用它的经验。谢谢您的参考。我也有同样的要求——我一直在使用包装器对象来实现它,但我需要减少一个非常大的映射所占用的内存,而包装器对象是一个巨大的开销。因此,我想对我来说,问题是GNU-Trove映射实现是否具有空间效率。Trove工作得很好——即使在我设定的更高负载下也是如此。然而,7年多过去了,我同意你的看法,我会简单地创建密钥包装器。
public class GeoIpData {
public CountryKey buildCountryKey() {
return new CountryKey(this.country);
}
}