通常人们说,当键是枚举时,我们应该使用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/

10-09 03:29