JVM Java字节码的角度分析switch的实现
Java字节码的角度分析switch的实现
作者 kesan 柯三 https://www.cnblogs.com/kesan/p/11684462.html
引子
在这个星球上活了22年,直到今天我才知道Java的Switch功能是如何实现的
前置知识
阅读本文需要你以对以下知识有所了解
- 数组
- switch语法
先考虑一个问题,switch会被编译器编译成if语句吗?如果是,为什么?如果不是,为什么?
一个妥协而又枯燥的方案
显而易见, 直接将switch语句翻译成if是最简洁的方案,直接用java代码表示如下

要是翻译成if我为啥不直接用if还要用你switch呢?
switch的实现
回顾历史
switch在JDK最开始的几个版本只支持对基本的数据类型进行判断
为什么只支持基础的数据类型,而不支持字符串如果真的是把switch语句翻译成if语句的话?
想想以下关键词,也许你就知道怎么设计了
- 仅支持基础数据类型
- 数组
字节码分析
用jclasslib插件看一下我们之前写的switch代码

很明显代码的关键在于lookupswitch
我们去看一下JVM的官方文档 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.lookupswitch
Access jump table by key match and jump
到这里已经很清晰了, 我总结了以下几点
- switch语句的实现是通过jump table来实现, 所谓jump table 中存储了 条件值(也就是flag)对应要执行代码的位置
- switch会对case进行排序,验证如下

问题来了,对数据进行排序的原因是啥?
首先明确一点jump table从概念上讲并非等同于hashtable, 也就是说无法根据值直接获取要执行代码的地址。
所以,排序是为了更快的查找【lookupswitch, look up 不就是查找吗,(*^_^*)】,推测其使用的应该是二分查找法(推测啊,妹看过JVM源码,咱也不敢肯定)
其他实现方式?
tableswitch 简单介绍一下,就是如果你数据是连续的并且间断不大,那么就会使用tableswitch

tableswitch可以直接使用跳表,因此其复杂度为O(1)。
JVM Java字节码的角度分析switch的实现的更多相关文章
- i = i++ 在java字节码层面的分析
有这么一段代码: package zl.test; public class PcodeTest { /** * @param args */ public static void main(Stri ...
- JVM Java字节码方法表与属性
方法表 1.methods_count method_info,前三个字段和field_info一样 2.方法的属性结构 方法中的每个属性都是一个attribut_info结构 JVM定义了部分at ...
- JVM --java 字节码的结构解析
Java字节码文件的主体结构分为一下几个部分:Class文件头部.常量池区域.当前类的描述信息.字段列表.方法列表.属性列表. Class文件头部 任何的class文件的前四个字节的内容就是CA FE ...
- Java字节码分析
目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码, ...
- Java字节码—ASM
前言 ASM 是什么 官方介绍:ASM is an all purpose Java bytecode manipulation and analysis framework. It can be u ...
- JVM 字节码指令手册 - 查看 Java 字节码
JVM 字节码指令手册 - 查看 Java 字节码 jdk 进行的编译生成的 .class 是 16 进制数据文件,不利于学习分析.通过下命令 javap -c Demo.class > Dem ...
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- JVM 内部原理(六)— Java 字节码基础之一
JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- JVM(三):深入分析Java字节码-上
JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...
随机推荐
- WPF 字体图标样式
1.在网上下载Font ICO 字体字体压缩包 Font Awesome 矢量图标库 2.下载到的压缩包,解压后获得图标字体文件 3.然后把字体文件夹拷贝到项目中,目录为(/fon ...
- 5分钟了解lucene全文索引
一.Lucene介绍及应用 Apache Lucene是当下最为流行的开源全文检索工具包,基于JAVA语言编写. 目前基于此工具包开源的搜索引擎,成熟且广为人知的有Solr和Elasticsearch ...
- Java Web总结(一)-- 入门
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- HashMap面试必问的数据结构相关知识
如果在看这篇文章时,对HashMap的结构还不是很了解,建议你参考前段时间写的<刨死你系列——HashMap剖析(基于jdk1.8)>,可能会对下面的提及到知识点有些帮助. 1:HashM ...
- java反射原理,应用
java类的加载过程 调用java命令运行程序时,该命令会启动一条java虚拟机进程,该程序的所有线程都会运行在这个虚拟机进程里面.程序运行产生的线程.变量都处于这个进程,共同使用该JVM进程的内存区 ...
- FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList
贪婪加载顾名思议就是把所有要加载的东西一次性读取. 本节内容为了配合[延时加载]而诞生,贪婪加载和他本该在一起介绍,开发项目的过程中应该双管齐下,才能写出高质量的程序. Dto 映射查询 Select ...
- Kafka源码分析及图解原理之Broker端
一.前言 https://www.cnblogs.com/GrimMjx/p/11354987.html 上一节说过,任何消息队列都是万变不离其宗都是3部分,消息生产者(Producer).消息消费者 ...
- MapReduce应用案例
1 环境说明 注意:本实验是对前述实验的延续,如果直接点开始实验进入则需要按先前学习的方法启动hadoop 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户 ...
- Fliptile(枚举+DFS)
Problem Description Farmer John knows that an intellectually satisfied cow is a happy cow who will g ...
- 是时候让大家看看你用django写出来的博客了(内含部署教程视频)
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客的基础功能已经开发的差不多了,虽然还有很多地方可以完善,但我们还是希望早点把博客部 ...