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的实现的更多相关文章

  1. i = i++ 在java字节码层面的分析

    有这么一段代码: package zl.test; public class PcodeTest { /** * @param args */ public static void main(Stri ...

  2. JVM Java字节码方法表与属性

    方法表 1.methods_count  method_info,前三个字段和field_info一样 2.方法的属性结构 方法中的每个属性都是一个attribut_info结构 JVM定义了部分at ...

  3. JVM --java 字节码的结构解析

    Java字节码文件的主体结构分为一下几个部分:Class文件头部.常量池区域.当前类的描述信息.字段列表.方法列表.属性列表. Class文件头部 任何的class文件的前四个字节的内容就是CA FE ...

  4. Java字节码分析

    目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码, ...

  5. Java字节码—ASM

    前言 ASM 是什么 官方介绍:ASM is an all purpose Java bytecode manipulation and analysis framework. It can be u ...

  6. JVM 字节码指令手册 - 查看 Java 字节码

    JVM 字节码指令手册 - 查看 Java 字节码 jdk 进行的编译生成的 .class 是 16 进制数据文件,不利于学习分析.通过下命令 javap -c Demo.class > Dem ...

  7. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  8. JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  9. JVM(三):深入分析Java字节码-上

    JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...

随机推荐

  1. 【Offer】[38] 【字符串的排列】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个字符串,打印出该字符串中字符的所有排列.例如,输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb. ...

  2. Docker下使用disconf:细说demo开发

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  3. Python作业本——第4章 列表

    课后习题: 1.[]是一个空列表 2. spam.insert(3, 'hello') 错,应为:spam[2] = 'hello' 3.['d']    'd' 4.['d']    'd' 5.[ ...

  4. java对象与json字符串的互相转换

    java对象与json字符串的互相转换 1.采用 net.sf.json.JSONObject maven依赖包: <dependency> <groupId>net.sf.j ...

  5. 史无前例的RNN讲解

    这篇博客不是一篇讲解原理的博客,这篇博客主要讲解time_steps,如果这篇博客没有让你明白time_steps,那么算我无能. 我曾翻阅各大网站,各大博客,他们的对RNN中time_steps的讲 ...

  6. map转java对象

    pom依赖: <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons ...

  7. 关于ArrayList源码

    一.构造方法 private static final int DEFAULT_CAPACITY = 10; //空参的构造方法,初始化数组长度为默认值,默认值为10 public ArrayList ...

  8. 安装完oracle11g_2x64位数据库后使用PL Developer链接oracle报错“请确认是否安装了32位oracle和TNS错误”解决方案

    解决使用PL Developer登录oracle报错没有配置TNS错误.首先安装好oracle11g数据库,安装PL developer32位 1,下载“instantclient-basic-win ...

  9. 【全网首创】修改 Ext.ux.UploadDialog.Dialog 源码支持多选添加文件,批量上传文件

    公司老框架的一个页面需要用到文件上传,本以为修改一个配置参数即可解决,百度一番发现都在说这个第三方插件不支持文件多选功能,还有各种各样缺点,暂且不讨论这些吧.先完成领导安排下来的任务. 任务一:支持多 ...

  10. Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000fa980000, 59244544, 0) failed; error='Cannot allocate memory' (errno=12)

    启动项目报错 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000fa980000, 592445 ...