为什么不使用HashMap来获得确切的enum,而不是逐个比较?



当我阅读IoTDB的源代码时,我发现也许我们可以在许多枚举类中添加HashMap,如TSEncoding,以提高从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;
}

不一定。

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

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

最后,我不知道这个查找有多重要。这种情况发生的频率有多高,这个决定的影响有多大?

另一个好处是,当前代码允许编译器在简单、清晰、惯用的Java代码中进行一些很好的优化。将它吗?我不知道,但它有机会。特别是在JIT的动态环境中,当它收集实际使用情况的统计数据时,可能会改变它的想法。

相关内容

  • 没有找到相关文章

最新更新