加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

JVM Java字节码的角度分析switch的达成

发布时间:2021-11-09 10:14:50 所属栏目:PHP教程 来源:互联网
导读:引子 在这个星球上活了22年,直到今天我才知道Java的Switch功能是如何实现的 前置知识 阅读本文需要你以对以下知识有所了解 数组 switch语法 先考虑一个问题,switch会被编译器编译成if语句吗?如果是,为什么?如果不是,为什么? 一个妥协而又枯燥的方案 显

引子
在这个星球上活了22年,直到今天我才知道Java的Switch功能是如何实现的
 
前置知识
阅读本文需要你以对以下知识有所了解
 
数组
switch语法
先考虑一个问题,switch会被编译器编译成if语句吗?如果是,为什么?如果不是,为什么?
 
一个妥协而又枯燥的方案
显而易见, 直接将switch语句翻译成if是最简洁的方案,直接用java代码表示如下
 
妥协的方案
 
要是翻译成if我为啥不直接用if还要用你switch呢?
 
switch的实现
回顾历史
switch在JDK最开始的几个版本只支持对基本的数据类型进行判断
 
为什么只支持基础的数据类型,而不支持字符串如果真的是把switch语句翻译成if语句的话?
 
想想以下关键词,也许你就知道怎么设计了
 
仅支持基础数据类型
数组
字节码分析
用jclasslib插件看一下我们之前写的switch代码
switch的字节码
 
很明显代码的关键在于lookupswitch
 
 
Access jump table by key match and jump
 
到这里已经很清晰了, 我总结了以下几点
 
switch语句的实现是通过jump table来实现, 所谓jump table 中存储了 条件值(也就是flag)对应要执行代码的位置
switch会对case进行排序,验证如下
switch对case进行排序
问题来了,对数据进行排序的原因是啥?
 
首先明确一点jump table从概念上讲并非等同于hashtable, 也就是说无法根据值直接获取要执行代码的地址。
 
所以,排序是为了更快的查找【lookupswitch, look up 不就是查找吗,(*^_^*)】,推测其使用的应该是二分查找法(推测啊,妹看过JVM源码,咱也不敢肯定)
 
其他实现方式?
tableswitch 简单介绍一下,就是如果你数据是连续的并且间断不大,那么就会使用tableswitch
tableswitch
tableswitch可以直接使用跳表,因此其复杂度为O(1)。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读