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".
无论如何,运行时性能是这里最重要的方面.
欢迎评论.
谢谢,马克西姆.
使用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)
| 归档时间: |
|
| 查看次数: |
3894 次 |
| 最近记录: |