【问题标题】:Trove4j TObjectIntHashMap vs EnumMap<Enum, Integer>Trove4j TObjectIntHashMap 与 EnumMap<Enum, Integer>
【发布时间】: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 价格昂贵。

标签: java trove4j enum-map


【解决方案1】:

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

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

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

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

【讨论】:

  • 聪明,当然开销最小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多