【发布时间】:2013-08-11 14:41:31
【问题描述】:
通常人们说当键是枚举时我们应该使用 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 使用 enum 作为 key 具有更高的性能,但 Integer 的检索和增量(装箱和拆箱)也需要时间。
如果我们考虑内存成本低和速度快,哪个会更好?
【问题讨论】:
-
覆盖或包装
EnumMap,你的代码会更简洁。EnumMap几乎肯定更快,因为它针对Enums 进行了优化。Trove映射适用于一般Objects,因此没有这些优化。 -
@BoristheSpider 通过同样的论点,Trove 针对
int值进行了优化,并且确实需要包装器。您必须测试给定的用例以确定哪个更好。我相信数组会比任何一个都好。 -
@PeterLawrey 我认为这不成立。我认为散列和查找花费时间而不是卫星数据的存储......
-
@BoristheSpider 与创建对象的成本相比,基于 int 的值的散列是微不足道的(如果计数足够高以执行此操作)在 trove 映射中使用条目的成本可能只是数量较少的 esp 价格昂贵。