使用密钥复合密钥进行高效的HashMap检索(从2个枚举构建)

Max*_*ler 0 java lookup performance hashmap composite-key

我有一个2枚举值表示对象的映射,我(当前)使用HashMap建模,其中2个枚举值用作键,对象是值.

这是低效的,因为我正在做的是为Enum1.values()x Enum2.values()的每个组合创建一个新的CompositeKey(Enum1 enum1,Enum2 enum2).

我想跳过新的CompositeKey()问题.

我目前想到的解决方法是计算了多次交涉从2个枚举,像int numericKey = enum1.ordinal() * 0xFFFF + enum2.ordinal();后来的时候我会尽map.get(numricKey)我仍然会自动拳击整数-因此创建新实例.

一个完美的解决方案(IMO)将Map实现(不必是通用的...),但我不认为这样的现有的Java.

另一种选择可能mapping = new Object[Enum1.values().length][Enum2.values().length]是我会用它查找,Object = mapping[enum1.ordinal()][enum2.ordinal()]但这似乎有点太"C'ish".

无论如何,运行时性能是这里最重要的方面.

欢迎评论.

谢谢,马克西姆.

Abh*_*kar 5

使用a的序数enum是一个非常糟糕的主意,因为序数是枚举的内部表示,不应该在外部代码中使用.Enum规范有关于序数的说法:

大多数程序员都没有使用这种方法.它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap.

我建议使用EnumMap专门设计的目的,就像你拥有的那样.EnumMap<Enum1,EnumMap<Enum2,V>>使用枚举值创建并填充它:

for (Enum1 e1: Enum1.values()) {
    map.put(e1, new EnumMap<Enum2,V>());
    for (Enum2 e2 : Enum2.values()) {
        map.get(e1).put(e2, getSomeValue(e1, e2));
    }
}
Run Code Online (Sandbox Code Playgroud)