通常人们会说,在键为枚举类型时我们应该使用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(装箱和拆箱)也需要时间。
如果考虑低内存成本和快速速度,哪种方法更好?
EnumMap
,您的代码将更加简洁。EnumMap
几乎肯定更快,因为它针对Enum
进行了优化。Trove
映射用于一般的Object
,因此没有这些优化。 - Boris the Spiderint
值并且不需要包装器。你需要测试特定的用例来确定哪个更好。我相信数组比两者都要好。 - Peter Lawrey