HashMap基本上具有O(1)的性能,而switch语句可以具有O(1)或O(log(n))的性能,这取决于编译器是否使用tableswitch或lookup switch。
可以理解的是,如果一个switch语句是这样写的,
switch (int) {
case 1:
case 2:
case 3:
case 4:
default:
}
如果使用tableswitch,与标准的HashMap相比,性能会有明显优势。但是如果switch语句是稀疏的呢?下面是两个需要进行比较的例子:
HashMap<Integer, String> example = new HashMap<Integer, String>() {{
put(1, "a");
put(10, "b");
put(100, "c");
put(1000, "d");
}};
.
switch (int) {
case 1:
return "a";
case 10:
return "b";
case 100:
return "c";
case 1000:
return "d";
default:
return null;
}
什么能提供更高的吞吐量,lookupswitch 还是 HashMap? HashMap 的开销是否会使得 lookupswitch 在开始时具有优势,但随着 case/entry 数量的增加而逐渐减少?
编辑:我使用了 JMH 进行了一些基准测试,以下是我的结果和使用的代码。https://gist.github.com/mooman219/bebbdc047889c7cfe612 正如你们所说,lookupswitch 语句的性能优于 HashTable。我仍然想知道为什么。
:)
- Matt Ball