HashMap的自定义哈希码/等于操作

Nei*_*ilA 5 java overriding equals hashmap hashcode

是否有一个HashMap类(或Map接口)的实现,它允许我使用备用哈希码和等于操作...类似于如何使用Collections.sort中的Comparator以多种方式对相同类型的集合进行排序(列表,比较器).

我想尽可能避免,创建一个提供所需哈希码和等于操作的密钥包装器.


就我而言,我需要这样的场景之一:

在我的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
Run Code Online (Sandbox Code Playgroud)

为实现此目的,上述3个映射需要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 }
Run Code Online (Sandbox Code Playgroud)

Mik*_*ail 7

GNU Trove允许您使用自己的哈希和等于TCustomHashMap的函数来提供特定的TObjectHashingStrategy.