Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap的自定义hashcode/equals操作_Java_Hashmap_Equals_Hashcode_Overriding - Fatal编程技术网

Java HashMap的自定义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和其他数据。 在代码的不同部分(在我的服务层和存储库层中),我将特定于其需

是否有HashMap类(或Map接口)的实现,允许我使用备用hashcode和equals操作。。。 类似于使用collections.sort(list,Comparator)中的Comparator以多种方式对相同类型的集合进行排序

如果可能的话,我希望避免创建一个密钥包装器来提供所需的hashcode和equals操作


在我的例子中,我需要这样的场景之一:

在我的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);
     }
}