0%

switch支持String底层剖析

switch支持String底层剖析

switch在JDK7之前只支持与整型类型兼容的类型,如char、byte、short、int以及它们的基本数据类型的封装类以及枚举类,在JDK7的时候增加了String类型,编译器是如何做到的呢?

1
2
3
4
5
6
7
8
9
10
11
12
public void testSwitch(String gender){
switch (gender){
case "男":
System.out.println("男");
break;
case "女":
System.out.println("女");
break;
default:
System.out.println("未知");
}
}

编译之后变成了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void testSwitch(String gender) {
byte var3 = -1;
//在switch中使用的是hashcode值
switch(gender.hashCode()) {
case 22899:
// 为了防止hash冲突,使用hash值匹配之后,还要使用equals比较一下
if (gender.equals("女")) {
var3 = 1;
}
break;
case 30007:
if (gender.equals("男")) {
var3 = 0;
}
}

switch(var3) {
case 0:
System.out.println("男");
break;
case 1:
System.out.println("女");
break;
default:
System.out.println("未知");
}

}