通常,当密钥是枚举时,人们会说我们应该使用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(装箱和取消装箱)的检索和增量也需要花费时间。
如果我们考虑低内存成本和快速速度,哪一个会更好?
发布于 2013-08-11 14:52:28
如果您想要更低的成本/更快的速度,可以使用简单的数组。
static final ExtraOperator[] VALUES = ExtraOperator.values();
private final int[] counts = new int[VALUES.length];
// to count.
counts[e.ordinal()]++;https://stackoverflow.com/questions/18173097
复制相似问题