以下哪一个是多键、多值哈希映射的更有效实现?
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 库中获取现有的,肯定会更快。
我想知道 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 库中获取现有的,肯定会更快。