switch可以进行跳转优化,java中对switch有两种处理方式,生成不同的jvm指令,一是tableswitch,一个是lookupswitch.
对于case的分支比较密集的情况,如
Java code
public class Test {
public static void main(String[] args) {
int i = 3;
switch (i) {
case 0:
System.out.println("0");
break;
case 1:
System.out.println("1");
break;
case 3:
System.out.println("3");
break;
case 5:
System.out.println("5");
break;
case 10:
System.out.println("10");
break;
case 13:
System.out.println("13");
break;
case 14:
System.out.println("14");
break;
default:
System.out.println("default");
break;
}
}
}
使用tableswitch,得到
Java code
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_1
2: iload_1
3: tableswitch{ //0 to 14
0: 76;
1: 87;
2: 153;
3: 98;
4: 153;
5: 109;
6: 153;
7: 153;
8: 153;
9: 153;
10: 120;
11: 153;
12: 153;
13: 131;
14: 142;
default: 153 }
76: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
79: ldc #3; //String 0
81: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
84: goto 161
87: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
90: ldc #5; //String 1
92: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
95: goto 161
98: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
101: ldc #6; //String 3
103: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
106: goto 161
109: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
112: ldc #7; //String 5
114: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
117: goto 161
120: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
123: ldc #8; //String 10
125: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
128: goto 161
131: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
134: ldc #9; //String 13
136: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
139: goto 161
142: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
145: ldc #10; //String 14
147: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
150: goto 161
153: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
156: ldc #11; //String default
158: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
161: return
}
从中可以看到tableswitch使用的跳转表。它这样查找,如果case值不在//0 to 14之间,直接执行default,如果在此范围之内,则取目标值-0这一项作为目标,比如switch(i),i为3,则跳转到3-0=3,使用数组中的第三项作为目标,也就是3: 98;直接去执行98行。
如果case中的值比较稀疏,则使用lookupswitch:
Java code
public class Test2 {
public static void main(String[] args) {
int i = 3;
switch (i) {
case 3:
System.out.println("3");
break;
case 20:
System.out.println("20");
break;
case 50:
System.out.println("50");
break;
case 100:
System.out.println("100");
break;
}
}
}
编译为
Java code
?
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_1
2: iload_1
3: lookupswitch{ //4
3: 44;
20: 55;
50: 66;
100: 77;
default: 85 }
44: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
47: ldc #3; //String 3
49: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
52: goto 85
55: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
58: ldc #5; //String 20
60: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
63: goto 85
66: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
69: ldc #6; //String 50
71: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
74: goto 85
77: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
80: ldc #7; //String 100
82: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
85: return
可以看到其中的
3: lookupswitch{ //4
3: 44;
20: 55;
50: 66;
100: 77;
default: 85 }
分享到:
相关推荐
### if与switch的区别 在程序设计中,`if`与`switch`是非常常见的两种选择结构。它们用于根据不同的条件执行不同的代码块。虽然两者都可以实现条件判断的功能,但它们之间存在一些重要的区别。 #### `if` 语句 `...
在大多数情况下,`switch-case`结构与多个`if-else`结构的性能差异并不显著。然而,在某些特定情况下,`switch-case`可能表现得更好: 1. **条件分支数量较多时**: - 当条件分支数量超过6个左右时,`switch-case`...
值得注意的是,if-else和switch语句的选择并不仅仅局限于性能的考虑,还包括代码的可读性和可维护性。在某些情况下,使用switch语句可以让代码更加清晰明了,尤其是在处理具有明确分类或等级制度的场景中。而在需要...
可以使用if-else或switch语句来处理不同税率段的情况。 练习7:奖金提成计算涉及到多个提成比例,需要根据利润范围选择合适的提成率。这通常使用嵌套的if-else结构完成。 以上就是Java逻辑基础题中涉及的知识点,...
随着软件工程的发展和技术的进步,优化`if`语句成为了提高程序性能、减少资源消耗以及提升代码可读性和可维护性的重要手段。本文将深入探讨`if`语句的优化技巧及其应用场景。 #### 一、使用三元运算符简化代码 ...
`if...else` 和 `switch` 语句是两种常见的选择,它们都用于逻辑判断和流程控制。然而,当条件分支变得非常复杂时,这两种方式可能会显得不够优雅或可维护。在本文中,我们将探讨如何使用 `if...else`、`switch` ...
`switch`语句提供了一种更简洁、更易读的多条件判断方法,相比传统的`if...else if...else`语句,它在处理大量可能的选项时更为高效。 **1. switch语句的基本结构** ```markdown switch(expression) { case value1...
Java中的switch语句是一种多路分支的选择流程控制结构,它提供了比if-else语句更为简洁的代码形式,尤其在处理多个等值判断...在实际开发中,需要根据具体情况选择使用switch还是if-else,以达到最佳的代码质量和性能。
- **外观设计**:你可以改变Switch的滑块颜色、背景色、文字颜色、大小等,使其与应用的整体风格保持一致。 - **动画效果**:添加平滑的过渡动画,使开关状态切换时更加自然。 - **交互行为**:调整开关的触摸...
在Android开发中,`Switch`控件是一种非常常见的交互元素,尤其在设置界面或选项配置中经常被使用。它在视觉上模拟了现实世界中的开关,用户可以通过滑动来开启或关闭某项功能。`Switch`是自Android 4.0(API级别14...
在性能方面,通常情况下,`switch` 比一系列的 `if...else if...else` 语句更快,因为它只需要找到匹配的 `case` 而不需要逐个测试。然而,对于复杂的逻辑,`if` 可能更易读且更灵活。在优化代码时,应根据实际情况...
在Android开发中,...注意,为了优化性能,通常会使用ViewHolder模式来避免频繁地查找视图,同时在`getView()`中适当地复用convertView。此外,如果数据源较大,考虑使用异步加载或分页加载技术来提高用户体验。
在Java等编程语言中,条件执行的实现依赖于条件语句,如if、else和switch等。理解这些语句的工作原理,对于编写高效和可读性高的代码至关重要。 首先,让我们看看if语句。if语句是最基础的条件执行结构,它允许程序...
通过研究`android4.0 switch`源码,开发者不仅可以理解`Switch`的基本工作原理,还能学习到如何进行UI组件的自定义和性能优化,这对于提升Android应用的用户体验至关重要。在`SwitchDemo`项目中,开发者可以找到实际...
在这篇文章中,我们将深入探讨Java switch关键字的原理和用法,并探讨其与if-else语句的区别。 一、Switch语法 switch语法的基本结构如下所示: ``` switch (exp) { case exp1: // 代码块 break; case exp2: ...
与多个`if...else if...else`语句相比,`switch`通常更简洁、高效: ```cpp switch (color) { case Red: // 处理红色 break; case Green: // 处理绿色 break; case Blue: // 处理蓝色 break; default: /...
5. **优化与性能**:`switch`语句通常比一系列的`if...else if...else`语句运行得更快,因为编译器能够对`switch`进行优化,创建一个查找表来提高执行速度。 6. **异常处理**:在`switch`结构中,错误的`case`标签...
在Java中,Switch语句通常用于替代多个if...else if...else结构,尤其当有多个可能的选项时,Switch的可读性和效率优势更加明显。 Switch语句的基本语法如下: ```java switch (expression) { case value1: // ...