通常人们说,当键是枚举时,我们应该使用EnumMap。但是在这种情况下,我想计算每个枚举值的频率,似乎trove4j TObjectIntHashMap在代码中更好。
以下是trove4j集合的示例:
TObjectIntMap<ExtraOperator> extraOpr = new TObjectIntHashMap<ExtraOperator>();
extraOpr.adjustOrPutValue(ExtraOperator.ternary, 1, 1);
对于EnumMap,代码如下:
Map<ExtraOperator, Integer> extraOpr = Maps.newEnumMap(ExtraOperator.class);
if (extraOpr.containsKey(ExtraOperator.ternary)) {
extraOpr.put(ExtraOperator.ternary, extraOpr.get(ExtraOperator.ternary) + 1);
} else {
extraOpr.put(ExtraOperator.ternary, 1);
}
因此,trove4j在内部检查存在性并可以自动增加值,这使代码更加简洁。 EnumMap使用枚举作为键具有更高的性能,但是Integer的检索和递增(装箱和拆箱)也要花费时间。
如果我们考虑降低内存成本和提高速度,哪一个更好?
最佳答案
如果您想降低成本/提高速度,可以使用一个普通数组。
static final ExtraOperator[] VALUES = ExtraOperator.values();
private final int[] counts = new int[VALUES.length];
// to count.
counts[e.ordinal()]++;
关于java - Trove4j TObjectIntHashMap与EnumMap <Enum,Integer>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18173097/