嵌套映射或java中的组合键

Pho*_*ixS 9 java key hashmap

我需要一个Map来在Java中创建一个缓存,以获得相同的值,我有两个String键.我的问题是,最好制作嵌套地图(每个键一个)或制作某种类型的自定义键与两个字符串?

访问缓存上的数据将始终使用两个密钥访问,我不需要通过这两个密钥中的任何一个对其进行分组.

然后,如果更好地结合字符串键只有一个什么它更好?

  • 自定义类与自定义getHash方法.但那么问题是哈希函数实现了什么?
  • 简单地将两个字符串连接在一起.例如:

    cache.put(key1 + key2,value)

Joh*_*n B 12

您可能想要考虑Guava的Table类.它们实现Map每个值有两个键.根据您的要求,这可能提供比复合键更可读的解决方案.

Table<String, String, MyValue>
Run Code Online (Sandbox Code Playgroud)


Xav*_*ica 11

您可以制作嵌套映射或使用自定义类定义hashCode().

它通常不是以连接键是一个好主意,你可以结束了冲突,如与钥匙的情况下1,并22和键122.他们映射到相同的值122.

如果你总是使用两个键,使用单个键Map总是会更有效率,你总是可以定义自己的适配器到地图,它将采用两个参数:

public class MyCache { 

    private Map<MyKey, Object> cache = new HashMap<MyKey, Object>();

    public Object getObject(Object key1, Object key2){
        return cache.get(new MyKey(key1, key2));
    }
    public void putObject(Object key1, Object key2, Object value){
        cache.put(new MyKey(key1, key2), value);
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,定义equals()hashCode()在自定义键类(如果需要添加无效检查).

public int hashCode() {
    int result = 17;
    result = 37 * result + keyA.hashCode();
    result = 37 * result + keyB.hashCode();
    return result;
}

public boolean equals(Object another) { 
    return another.keyA.equals(keyA) && another.keyB.equals(keyB);
} 
Run Code Online (Sandbox Code Playgroud)