怎么定义稀疏
所以,在 switch 里面,我们怎么定义稀疏呢?
文档中没有写。
文档里没有写的,都在源码里面。
于是我搞了个 openJDK,我倒要看看源码里面到底什么是 TMD 稀疏。
经过一番探索,找到了这个方法:
com.sun.tools.javac.jvm.Gen#visitSwitch
这里我不做源码解读,我只是想单纯的知道源码里面到底什么 TMD 是 TMD 稀疏。
断点时候时候各个参数如下:
标号为 ① 的地方是代表我们确实调试的是预期的程序。
标号为 ② 的地方我们带入到上面的表达式中,可以求得最终值:
hi 是 case 里面的表达式对应的最大值,也就是 2。
lo 是 case 里面的表达式对应的最小值,也就是 0。
nlabels 代表的是 case 的个数,也就是 3。
所以带入到上面的代码中,最终算出来的值 16<=18,成立,使用 tablewitch。
这就叫不稀疏。
假设我们把最后一个 case 改为 5:
最终算出来的值 19<=18,不满足,使用 lookupswitch 。
这叫做稀疏。
所以现在我们知道了到底什么是 TMD 稀疏。
在源码里面有个公式可以知道是不是稀疏的,从而知道使用什么指令。
写到这里我觉得其实我应该可以住手了。
但是我还在《Java 虚拟机规范》的文档里面挖到了一句话。我觉得得讲一下。
switch表达式支持的类型
在《Java 虚拟机规范》文档中的这一部分,有这样的一句话: