手机版
你好,游客 登录 注册
背景:
阅读新闻

JVM Java字节码的角度分析switch的实现

[日期:2019-11-09] 来源:cnblogs.com/kesan  作者:kesan 柯三 [字体: ]

引子

在这个星球上活了22年,直到今天我才知道Java的Switch功能是如何实现的

前置知识

阅读本文需要你以对以下知识有所了解

  • 数组
  • switch语法

先考虑一个问题,switch会被编译器编译成if语句吗?如果是,为什么?如果不是,为什么?

一个妥协而又枯燥的方案

显而易见, 直接将switch语句翻译成if是最简洁的方案,直接用java代码表示如下

妥协的方案

要是翻译成if我为啥不直接用if还要用你switch呢?

switch的实现

回顾历史

switch在JDK最开始的几个版本只支持对基本的数据类型进行判断

为什么只支持基础的数据类型,而不支持字符串如果真的是把switch语句翻译成if语句的话?

想想以下关键词,也许你就知道怎么设计了

  • 仅支持基础数据类型
  • 数组

字节码分析

用jclasslib插件看一下我们之前写的switch代码
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进行排序,验证如下
    switch对case进行排序

问题来了,对数据进行排序的原因是啥?

首先明确一点jump table从概念上讲并非等同于hashtable, 也就是说无法根据值直接获取要执行代码的地址。

所以,排序是为了更快的查找【lookupswitch, look up 不就是查找吗,(*^_^*)】,推测其使用的应该是二分查找法(推测啊,妹看过JVM源码,咱也不敢肯定)

其他实现方式?

tableswitch 简单介绍一下,就是如果你数据是连续的并且间断不大,那么就会使用tableswitch
tableswitch
tableswitch可以直接使用跳表,因此其复杂度为O(1)。

linux
相关资讯       switch  JVM Java字节码 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款