为什么不使用 HashMap 来获取确切的枚举,而不是一个一个地进行比较呢?
Why not using a HashMap to get the exact enum instead of compare it one by one?
当我阅读IoTDB的源代码时,我发现也许我们可以在很多枚举class中添加一个HashMap,比如TSEncoding
,以减少从[=中查找的时间复杂度12=] 到 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 的动态环境中,它可以在收集有关其实际使用情况的统计信息时改变主意。
当我阅读IoTDB的源代码时,我发现也许我们可以在很多枚举class中添加一个HashMap,比如TSEncoding
,以减少从[=中查找的时间复杂度12=] 到 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 的动态环境中,它可以在收集有关其实际使用情况的统计信息时改变主意。