我想知道Java中哪个是多键/多值散列映射的更高效实现:列表作为键/值的散列映射更有效,或者是将对象作为键/值的散列映射,为什么?例如:
列出键/值:
HashMap<List<Integer>,List<Double>> listmap = new HashMap<List<Integer>,List<Double>>();
对象作为键/值
HashMap<Object1,Object2> objectmap = new HashMap<Object1,Object2>(); // where Object 1 and 2 have fields for Integer keys and Double values, respectively
先谢谢! (注意:我测试了这个,发现对象更好,但我真的不明白为什么会这样)
编辑:(对象的实现方式)
public class keys {
public final int x;
public final int y;
public keys(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof keys)) return false;
keys key = (keys) o;
return x == key.x && y == key.y;
}
@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}
}
答案 0 :(得分:1)
如果你的键和值总是有特定数量的元素,那么编写自己的对象会更有效:当列表包含任意数量的元素时,列表需要装箱和数组开销,而你可以避免所有通过编写自己的专业实现。
答案 1 :(得分:0)
集合(例如List)旨在处理无限(良好,合理无界)的元素集合,因此它们会导致其基本操作(hashCode,equals等)的开销,存储基元(装箱) / unboxing)和内存占用,而不是为特定数量的元素编写的类。
如果直接写成一个类而不是在一个可变大小的List对象中进行抽象,那么只需要保存2个整数的键就会更加优化。
答案 2 :(得分:0)
如果您只有两个密钥并且它们是int
个,请将它们打包到long
(((long) x) << 32) | (y & 0xFFFFFFFFL)
,然后使用未装箱的原始Map
实施自定义long
密钥,或从Koloboke / fastutil / GS集合/ HPPC / HPPC-RT库中获取,肯定会更快。