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. WPF 字体图标样式

    1.在网上下载Font ICO 字体字体压缩包 Font Awesome 矢量图标库    2.下载到的压缩包,解压后获得图标字体文件        3.然后把字体文件夹拷贝到项目中,目录为(/fon ...

  2. 5分钟了解lucene全文索引

    一.Lucene介绍及应用 Apache Lucene是当下最为流行的开源全文检索工具包,基于JAVA语言编写. 目前基于此工具包开源的搜索引擎,成熟且广为人知的有Solr和Elasticsearch ...

  3. Java Web总结(一)-- 入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  4. HashMap面试必问的数据结构相关知识

    如果在看这篇文章时,对HashMap的结构还不是很了解,建议你参考前段时间写的<刨死你系列——HashMap剖析(基于jdk1.8)>,可能会对下面的提及到知识点有些帮助. 1:HashM ...

  5. java反射原理,应用

    java类的加载过程 调用java命令运行程序时,该命令会启动一条java虚拟机进程,该程序的所有线程都会运行在这个虚拟机进程里面.程序运行产生的线程.变量都处于这个进程,共同使用该JVM进程的内存区 ...

  6. FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList

    贪婪加载顾名思议就是把所有要加载的东西一次性读取. 本节内容为了配合[延时加载]而诞生,贪婪加载和他本该在一起介绍,开发项目的过程中应该双管齐下,才能写出高质量的程序. Dto 映射查询 Select ...

  7. Kafka源码分析及图解原理之Broker端

    一.前言 https://www.cnblogs.com/GrimMjx/p/11354987.html 上一节说过,任何消息队列都是万变不离其宗都是3部分,消息生产者(Producer).消息消费者 ...

  8. MapReduce应用案例

    1 环境说明 注意:本实验是对前述实验的延续,如果直接点开始实验进入则需要按先前学习的方法启动hadoop 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户 ...

  9. Fliptile(枚举+DFS)

    Problem Description Farmer John knows that an intellectually satisfied cow is a happy cow who will g ...

  10. 是时候让大家看看你用django写出来的博客了(内含部署教程视频)

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客的基础功能已经开发的差不多了,虽然还有很多地方可以完善,但我们还是希望早点把博客部 ...