Java中的switch语句
很多人在学习Java语言的时候,应该就听说switch语句和if else差不多,其实事实上真的是这样吗?尤其是当你真的写代码的时候,是使用一个if else还是使用switch呢?让我们带着这些问题来仔细阅读以下本文的内容吧。 首先我们来看一个简单的代码,他们实现的功能类似,但分别使用的打包开关(packed switch),稀疏开关(sparse switch)以及if else。 这段代码非常简单,也许你的老师会告诉你,这些代码最终编译出来都是一样的,那么事实上真的如此吗?其实假如你看jvm的代码的话,会发现它们其实是不相同的。我们可以使用下面命令来看jvm的代码: 上面类的的jvm代码如下所示: 下面我们就来仔细看一下,首先来看if else, 和我们想象得差不多,一个一个地进行比较,要是有相等的就return。这个应该和我们想象得比价类似吧。 下面来看switch的情况,switch有两种情况,一种就是各个switch的值比较靠近,如下: 它编译的结果如下: 这里你会发现其实有一个tableswitch的东西,那这个是什么呢?在JVM spec中有讲到。 简单来讲,就是说其实类似做了一个key value的表,在key范围内的值,则会通过index直接找到相应的值,而范围之外,就直接返回默认值了。 而假如你使用是一个稀疏switch,也就是说各个case之间的值变化很大,他会怎么来实现呢? 他编译的结果如下: 这里我们看到他不再使用tableswitch了,它使用的是一个lookupswitch,其实说白了,他就是把所有的key排序,然后查找的时候就可以在一个有序表中进行查找了,这个效率其实相对tableSwtich就有一些差别了。当然和if else比则又不相同了。 好了,看了本文之后是不是才恍然大悟,原来我们平常看到的简单代码背后竟然有这么多不同的逻辑。 参考文章:https://www.dreamincode.net/forums/blog/1748/entry-4558-switch-statements-in-java/