【问题标题】:Why not using a HashMap to get the exact enum instead of compare it one by one?为什么不使用 HashMap 来获取确切的枚举而不是一一比较呢?
【发布时间】:2021-12-10 01:42:03
【问题描述】:

在阅读 IoTDB 的源代码时,我发现也许我们可以在 TSEncoding 这样的许多枚举类中添加一个 HashMap 来改善从 O(n) 查找到 O(1) 的时间复杂度,例如:

private static final Map<Byte, TSEncoding> map = new HashMap<>();

static {

TSEncoding[] array = TSEncoding.values();
for (TSEncoding e : array) {
  map.put(e.type, e);
}
}

private static TSEncoding getTsEncoding(byte encoding) {

TSEncoding ret = map.get(encoding);

if (ret == null) {
throw new IllegalArgumentException("Invalid input: " + encoding);
}

return ret;
}

【问题讨论】:

    标签: java database time-series apache-iotdb iotdb


    【解决方案1】:

    不一定。

    枚举中只有 9 个条目。 HashMap 是一种昂贵的数据结构,对于这个简单的用例,它的O(1) 可能比O(n) 更多,特别是考虑到如何使用它。奇怪的是,编码方法并没有被普遍使用,而且最流行的方法是在它们使用的 switch 语句的早期确定的。

    可以说,如果他们将解码列表放入静态数组并使用偏移量进行查找,那将是最快的。但是,可能还有其他原因,他们决定不想维护该结构并多走一步。

    最后,我不知道这个查找的主线如何。它多久发生一次,这个决定有多大影响?

    另一个好处是,当前代码允许编译器潜在地对用简单、清晰、惯用的 Java 代码表达的内容进行一些很好的优化。会吗?我不知道,但它有机会。尤其是在 JIT 的动态环境中,当它收集有关其实际使用方式的统计数据时,它可能会在以后改变主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2017-11-14
      • 1970-01-01
      • 2019-10-24
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多