`
aubdiy
  • 浏览: 693129 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Switch语句及性能剖析

    博客分类:
  • Java
阅读更多

Java Switch语句及性能剖析(转载补充)

 

一、基本用
switch的case语句可以处理int,short,byte,char类型的值,但是不能处理long,String等类型。
因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出。
  1. char a = 'e';  
  2. switch (a) {  
  3.     case 'c':  
  4.         System.out.println("In case c");  
  5.         break;  
  6.     case 'd':  
  7.         System.out.println("In case d");  
  8.         break;  
  9.     default:  
  10.         System.out.println("In default");  
  11.         break;  
  12.     case 'e':  
  13.         System.out.println("In case e");  
  14.         break;  
  15. }  
   0:   bipush  101
   2:   istore_1
   3:   iload_1
   4:   tableswitch{ //99 to 101
                99: 32;
                100: 43;
                101: 65;
                default: 54 }
生成的字节码始终为bipush或iconst(小于5的整数),用于将整数压入栈。 
二、新特性
在JDK 5中加入的枚举Enum类型也是可以作为case值的。
  1. Type t = Type.C;  
  2. switch (t) {  
  3.     case A:  
  4.         System.out.println("In case A");  
  5.         break;  
  6.     case B:  
  7.         System.out.println("In case B");  
  8.         break;  
  9.     default:  
  10.         System.out.println("In default");  
  11.         break;  
  12.     case C:  
  13.         System.out.println("In case C");  
  14.         break;  
  15. }  
   0:   getstatic       #18; //Field com/cdai/jdk/Type.C:Lcom/cdai/jdk/Type;
   3:   astore_1
   4:   invokestatic    #24; //Method $SWITCH_TABLE$com$cdai$jdk$Type:()[I
   7:   aload_1
   8:   invokevirtual   #27; //Method com/cdai/jdk/Type.ordinal:()I
   11:  iaload
   12:  tableswitch{ //1 to 3
                1: 40;
                2: 51;
                3: 73;
                default: 62 }
从字节码可以看出,对于枚举类型也是调用它的ordinal方法转成整型后进行switch匹配的。
在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了。
三、两种字节码
switch语句有两种编译结果:
当case中的值连续时,编译成tableswitch,解释执行时从table数组根据case值计算下标来取值,从数组中取到的
便是要跳转的行数。
[java] view plaincopy
  1. int a = 1;  
  2. switch (a) {  
  3.     case 2:  
  4.         System.out.println("In case 2");  
  5.         break;  
  6.     case 3:  
  7.         System.out.println("In case 3");  
  8.         break;  
  9.     default:  
  10.         System.out.println("In default");  
  11.         break;  
  12.     case 1:  
  13.         System.out.println("In case 1");  
  14.         break;  
  15. }  
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   tableswitch{ //1 to 3
                1: 61;
                2: 28;
                3: 39;
                default: 50 }

   28:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   31:  ldc     #22; //String In case 2
   33:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   36:  goto    69
   39:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   42:  ldc     #30; //String In case 3
   44:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   47:  goto    69
   50:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   53:  ldc     #32; //String In default
   55:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   58:  goto    69
   61:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   64:  ldc     #34; //String In case 1
   66:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
当case中的值不连续时,编译成lookupswitch,解释执行时需要从头到尾遍历找到case对应的代码行。
因为case对应的值不是连续的,如果仍然用表来保存case对应的行号,会浪费大量空间。
[java] view plaincopy
  1. int a = 10;  
  2. switch (a) {  
  3.     case 2:  
  4.         System.out.println("In case 2");  
  5.         break;  
  6.     case 3:  
  7.         System.out.println("In case 3");  
  8.         break;  
  9.     default:  
  10.         System.out.println("In default");  
  11.         break;  
  12.     case 10:  
  13.         System.out.println("In case 10");  
  14.         break;  
  15. }  
   0:   bipush  10
   2:   istore_1
   3:   iload_1
   4:   lookupswitch{ //3
                2: 40;
                3: 51;
                10: 73;
                default: 62 }

   40:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   43:  ldc     #22; //String In case 2
   45:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   48:  goto    81
   51:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   54:  ldc     #30; //String In case 3
   56:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   59:  goto    81
   62:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   65:  ldc     #32; //String In default
   67:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   70:  goto    81
   73:  getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   76:  ldc     #34; //String In case 10
   78:  invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
由此可以看出,这两种编译结果是编译器在考虑空间占用情况下,对代码效率进行的优化。
另外需要注意一点,就是不管是tableswitch还是lookupswitch,default标签都放在最后进行匹配,
但下面各个case和default语句块的顺序是与源代码相同的。所以尽管default标签没有放在最后,
但它仍然是最后被匹配的。

 

 个人补充:
由于现在的机器性能强劲, 系统的瓶颈更多是IO/DB等,一般不是if else 或者switch,mysql jdbc dirver源码中,
查询结果集resultSet.getObject("aaa")的时候使用的就是if else,
但是个人认为switch代码会使程序易读,易维护

 原帖地址:http://blog.csdn.net/dc_726/article/details/7723497

 

 

分享到:
评论

相关推荐

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-091-Java基本语法-控制语句-switch语句-字符串作为比较对象.avi 北京动力节点-Java编程零基础教程-092-Java基本语法-控制语句-switch语句-举例1.avi 北京动力节点-Java编程零...

    Java程序设计基础:switch选择结构.pptx

    switch选择结构 目录 课程导入 掌握 switch 选择结构的语法 掌握 switch 选择结构的使用 【问题】根据学生的百分制成绩转化为等级制成绩并输出。 什么情况下使用switch选择结构 转化规则: 百分制成绩score 等级制...

    Java从入门到精通教程全套

    001_经典Java核心技术学习路线先导片,mp4 002_Java开发入门计算机基本概念与DOS命令.mp4 003_Java开发入门发展史体系与下载.mp4 004_Java开发入门JDK安装与环境变量配置.mp4 ...018_Java编程基础_switch分支语句.mp4

    计算机程序设计(Java)-教案--单元二--Java语言开发基础.docx.docx

    :・Switch语句的用法; 工程描述 :・工程1:猜数字游戏 教学方法 问题导引法:通过给学生提出实际编程中出现的问题来引入教学内容,使学生在主动分析、讨论和解决问题的过程中掌握所学知识; :・案例分析法:通过...

    JAVA阶段模拟试题

    1给定如下Java程序,编译运行时,将在()出现错误。(选一项) public class Test{ public static void main(String[]args){ ...C终止switch语句的语句序列,提高switch-case语句性能 D退出循环

    java数据结构测试题及答案解析.doc

    Java数据结构试题及解析 1 下列数据结构中,能用二分法进行查找的是__A____。 A、顺序存储的有序线性表 B、线性链表 C、二叉链表 D、有序线性链表 解析:二分法查找只适用于顺序存储的有序表。在此所说的有序表是指...

    动力节点JAVA完美学习课程 JAVA黄埔军校2018年最新JAVA夜校班全程班视频教程 1-56部分.txt

    ├─(44) 044-Java夜校视频教程-switch case.avi ├─(45) 045-Java夜校视频教程-for循环.avi ├─(46) 046-Java夜校视频教程-for循环总结.avi ├─(47) 047-Java夜校视频教程-while循环.avi ├─(48) 048-Java夜校...

    Java从入门到精通核心技术教程全套千峰2021新版35G

    ├─第01章 Java开发入门 │ 002_Java开发入门_计算机基本概念与DOS命令.mp4 │ 003_Java开发入门_发展史体系与下载.mp4 ...│ 018_Java编程基础_switch分支语句.mp4 │ 020_Java编程基础_while与dowhile循环.mp4

    JAVA语言程序设计课程教学大纲.doc

    掌握switch语句的使用。 (4)掌握数组的定义与使用。 实验二 面向对象基础 1.实验的基本内容 (1)定义类包括成员变量,构造函数,成员方法,并调用构造函数创建对象。 (2)理解成员变量的继承与隐藏

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.2.2 插曲:Java中的语句 37 3.2.3 创建一个变量和变量名的规范 37 3.2.4 Java中的基本运算符和表达式 39 3.2.5 Java中的布尔运算符 43 3.3 基本数据类型运算的难点 47 3.3.1 强制类型转换——小数哪里去了 48...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    疯狂JAVA讲义

    1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.2.2 插曲:Java中的语句 37 3.2.3 创建一个变量和变量名的规范 37 3.2.4 Java中的基本运算符和表达式 39 3.2.5 Java中的布尔运算符 43 3.3 基本数据类型运算的难点 47 3.3.1 强制类型转换——小数哪里去了 48...

    java自学之道

    6.1 if语句和switch语句 6.1.2 if语句举例 6.1.3 switch语句 6.2 for循环语句 6.3 while语句和do-while语句 6.3.1 while语句形式 6.3.2 do-while语句 6.3.3 while语句和do-while语句举例 6.4 break语句和...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    java基础案例与开发详解案例源码全

    1.1 Java语言发展简史2 1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 ...

    Thinking in java4(中文高清版)-java的'圣经'

    研讨课 Hands-on Java研讨课CD Thinking in Objects研讨课 Thinking in Enterprise Java Thinking in Patterns(with Java) Thinking in Patterns研讨课 设计咨询与复审 附录B 资源 软件 编辑器与IDE 书籍 分析与设计...

    JAVA基础课程讲义

    switch多选择结构 37 循环结构 39 While和dowhile的区别 41 For循环 42 break语句和continue语句 47 语句块 48 递归结构 49 本章作业 50 本章上机操作 51 第三章 JAVA面向对象程序开发 52 编程语言发展史 52 类和...

    java编程基础,应用与实例

    4.2 switch语句 44 4.3 for语句 46 4.3.1 break语句 49 4.3.2 continue语句 49 4.3.3 多重for循环语句 50 4.3.4 多重for循环语句中的break与continue 52 4.4 while语句 55 4.5 do-while语句 57 4.6...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

Global site tag (gtag.js) - Google Analytics