通常人们说当密钥是枚举时我们应该使用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使用枚举作为键具有更高的性能,但整数(装箱和拆箱)的检索和增量也会花费时间。
如果我们考虑低内存成本和快速速度哪一个会更好?
答案 0 :(得分:3)
如果您想降低成本/更快,可以使用普通数组。
static final ExtraOperator[] VALUES = ExtraOperator.values();
private final int[] counts = new int[VALUES.length];
// to count.
counts[e.ordinal()]++;