Trove4j TObjectIntHashMap vs EnumMap <enum,integer =“”> </enum,>

时间:2013-08-11 14:41:31

标签: java trove4j enum-map

通常人们说当密钥是枚举时我们应该使用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使用枚举作为键具有更高的性能,但整数(装箱和拆箱)的检索和增量也会花费时间。

如果我们考虑低内存成本和快速速度哪一个会更好?

1 个答案:

答案 0 :(得分:3)

如果您想降低成本/更快,可以使用普通数组。

 static final ExtraOperator[] VALUES = ExtraOperator.values();

 private final int[] counts = new int[VALUES.length];

 // to count.
 counts[e.ordinal()]++;