我需要一个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和键12和2.他们映射到相同的值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)
| 归档时间: |
|
| 查看次数: |
10250 次 |
| 最近记录: |