Java7版本: switch语句支持String、Enum类型(JDK1.5)与原来byte、short、char和int.
来源:互联网 发布:永泰县财政局网络 编辑:程序博客网 时间:2024/05/17 22:05
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7中,呼吁很久的String支持也终于被加上了。
PS: JDK1.5起switch语句支持Enum枚举值,JDK1.7起支持String类型(但不能比较null值/传入或case语句都不行,因为底层是通过javac编译调用str.equals(String)方法)。
例如,下面是一段switch中使用String的示例代码。
01
public
class
Test {
02
03
public
void
test(String str) {
04
switch
(str) {
05
case
"abc"
:
06
System.out.println(
"abc"
);
07
break
;
08
case
"def"
:
09
System.out.println(
"def"
);
10
break
;
11
default
:
12
System.out.println(
"default"
);
13
}
14
}
15
16
}
在switch语句中,String的比较用的是String.equals,因此大家可以放心的使用。
需要注意的是,传给switch的String变量不能为null,同时switch的case子句中使用的字符串也不能为null。
为什么要有这些非null的限制呢?其实,我们只要将这段代码反汇编出来,看一下底层到底是如何实现的,就可以明白了。下面是汇编出来的代码。
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public void test(java.lang.String);
Code:
0: aload_1
1: astore_2
2: iconst_m1
3: istore_3
4: aload_2
5: invokevirtual #2; //Method java/lang/String.hashCode:()I
8: lookupswitch{ //2
96354: 36;
99333: 50;
default: 61 }
36: aload_2
37: ldc #3; //String abc
39: invokevirtual #4; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
42: ifeq 61
45: iconst_0
46: istore_3
47: goto 61
50: aload_2
51: ldc #5; //String def
53: invokevirtual #4; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
56: ifeq 61
59: iconst_1
60: istore_3
61: iload_3
62: lookupswitch{ //2
0: 88;
1: 99;
default: 110 }
88: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
91: ldc #3; //String abc
93: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
96: goto 118
99: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
102: ldc #5; //String def
104: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
107: goto 118
110: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
113: ldc #8; //String default
115: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
118: return
}
估计有些同学懒得看这些汇编,其实把上面的汇编代码用Java写出来就是下面的样子了。
写到这里,大家应该能明白为什么不能用null了吧。
01
public
class
Test {
02
public
void
test(String str) {
03
int
i = -
1
;
04
switch
(str.hashCode()) {
05
case
96354
:
// "abc".hashCode()
06
if
(str.equals(
"abc"
)) {
07
i =
0
;
08
}
09
break
;
10
case
99333
:
// "def".hashCode()
11
if
(str.equals(
"def"
)) {
12
i =
1
;
13
}
14
break
;
15
default
:
16
break
;
17
}
18
19
switch
(i) {
20
case
0
:
21
System.out.println(
"abc"
);
22
break
;
23
case
1
:
24
System.out.println(
"def"
);
25
break
;
26
default
:
27
System.out.println(
"default"
);
28
}
29
}
30
}
如果switch传入的null,那么在运行时对一个null对象调用hashCode方法会出现NullPointerException。
如果switch的case写的是null,那么在编译时无法求出hashCode,因此在编译时就会报错了。
switch支持String只是一个语法糖,由javac来负责生成相应的代码。底层的JVM在switch上并没有进行修改。
参考
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
0 0
- Java7版本: switch语句支持String、Enum类型(JDK1.5)与原来byte、short、char和int.
- java可以做switch case的只有int类型,和可以自动类型转换为int的byte, char,short
- enum类型是静态,enum类型仅限于long、int、short 和byte。string 是 System.String的别名,没有什么区别,只不过string是关键字。
- Java7中Switch语句支持String
- byte、short、char和int的转换
- byte 和boolean,int,String,char,short,long之间的转换
- byte、short和char 隐式的转换为int
- byte、short和char隐式的转换为int
- Java7中switch支持String
- Java7中Switch支持String
- char/byte/short类型的加法和类型转换问题
- switch(expr1)char byte short int [整数表达式或者枚举常量]
- char类型和short,int类型之类的转换
- jdk1.7的switch语句支持String数据类型了
- string与int和char之间的类型转换问题
- java对byte,short,char,int,long运算时自动类型转化情况说明
- java对byte,short,char,int,long运算时自动类型转化情况说明
- 怎么在byte、short、char、int类型参数方法中重载
- ibatis 入门
- WinExec、ShellExecute和CreateProcess及返回值判断方式
- 使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录
- cocos2d+TexturePackerGUI动画制作
- git_基本使用操作,绝对最清楚
- Java7版本: switch语句支持String、Enum类型(JDK1.5)与原来byte、short、char和int.
- linux配置服务器笔记
- lunux命令笔记
- memcached命令
- 虚拟机网卡桥接到无线网卡上 无法上网解决方法
- 「cocos2d-x」瓦片地图学习(1)(2)
- Numerical Analysis---Hermite Interpolation
- hdu_4707
- matlab的一些命令