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

Which of these is a more efficient implementation of a multiple key, multiple value hash map?

我想知道 Java 中哪个是多键/多值 hashmap 的更有效实现:列表为 key/values 的 hashmap 或对象为 [= 的 hashmap 更有效25=] 为什么?例如:

列为 keys/values:

HashMap<List<Integer>,List<Double>> listmap = new   HashMap<List<Integer>,List<Double>>();

对象为 keys/values

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;
}

}

如果您的键和值始终具有特定数量的元素,那么编写您自己的对象会更有效率:当列表可以包含任意数量的元素时,它们需要装箱和数组开销,而您可以通过编写您自己的专门实现来避免所有这些。

集合(例如 List)旨在处理无界(嗯,合理地无界)元素集合,因此它们会对其基本操作(hashCode、equals 等)、原语存储产生开销(boxing/unboxing),以及内存占用,而不是为特定数量的元素编写的 class。

如果直接写成 class 而不是在可变大小的 List 对象中抽象,那么只需要保存 2 个整数的键将明显更优化。

如果您正好有两个键,并且它们是 int,将它们打包到 long 中,就像 (((long) x) << 32) | (y & 0xFFFFFFFFL) 并使用未装箱的原语 [=11] 实现自定义 Map =] 键,或者从 Koloboke/fastutil/GS collections/HPPC/HPPC-RT 库中获取现有的,肯定会更快。