以下哪一项是多键,多值哈希映射的更有效实现?

时间:2015-02-02 21:48:13

标签: java performance data-structures collections

我想知道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;
}

}

3 个答案:

答案 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库中获取,肯定会更快。