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文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...
随机推荐
- grep : app :Is a directory
今天在查日志的时候用grep命令,遇到这样的一个问题,grep : app :Is a directory 用的grep命令是这样的:grep -10 '2019-08-14 21:22:39.252 ...
- 用webpack构建一个常规项目,好处和坏处分析
最近项目改版,用webpack重新架构. 些许心得我会写几篇记录一下. 好处如下: 1.ES6语法用起来,babel-loader转义,各种新语法用起来. 2.import 语法写起来,webpack ...
- HDU 1015 Safecracker (DFS)
题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...
- 洛谷 P1219八皇后
把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...
- elk安装和使用
elk安装和使用 使用的版本都是5.2.0 elasticsearch-5.2.0安装 在官网 下载 elasticsearch tar包 解压安装 tar zxf elasticsearch-5.2 ...
- application.properties 乱码 (已验证)
1.打开Eclipse或MyEclipse 2.选择window-Preferences-content Types-Text-Java Properties File 3.将Java Propert ...
- PLC与上位机的socket通讯——上位机C#程序(二)
C#的网口通信 一.命令行 客户端程序:using System;using System.Collections.Generic;using System.Linq;using System.Tex ...
- redis的安装和pip连接
一.首先说说我的环境. 操作系统:Ubuntu16.04 能联网(使用了桥接方式) 二.安装redis cd进一个文件夹. 控制台输入 weget http ...
- python常用数据结构讲解
一:序列 在数学上,序列是被排成一排的对象,而在python中,序列是最基本的数据结构.它的主要特征为拥有索引,每个索引的元素是可迭代对象.都可以进行索引,切片,加,乘,检查成员等操作.在py ...
- 云服务器 ECS Linux 系统 MySQL 备份的导入导出
MySQL 备份的导出 注意: 如果您使用的是帮助中心的一键环境配置,那么 MySQL 的安装目录是 /alidata/server/mysql. 如果您将 MySQL 安装到其他目录,您需要输入您 ...