看了H大的博客之后,发现还有反编译代码看实现细节的操作,学习一波,吸收营养。文末放博客链接地址。
switch对整型支持的实现细节
源代码,如下:
public class SwitchTest{
public static void main(String[] args) {
int a=1;
switch (a) {
case 1:
System.out.println(1);
break;
case 5:
System.out.println(5);
break;
case 6:
System.out.println(6);
default:
break;
}
}
}
反编译之后:
import java.io.PrintStream;
public class SwitchTest {
public static void main(String[] arrstring) {
int n = 1;
switch (n) {
case 1: {
System.out.println(1);
break;
}
case 5: {
System.out.println(5);
break;
}
case 6: {
System.out.println(6);
}
}
}
}
可以看到,反编译前后没有什么区别。就是直接比较整型的值。
Switch对字符型的支持实现细节
源代码:
public class SwitchTest{
public static void main(String[] args) {
char b='e';
switch (b) {
case 'a':
System.out.println(1);
break;
case 'c':
System.out.println(5);
break;
case 'e':
System.out.println(6);
default:
break;
}
}
}
反编译后:
import java.io.PrintStream;
public class SwitchTest {
public static void main(String[] arrstring) {
int n = 101;
switch (n) {
case 97: {
System.out.println(1);
break;
}
case 99: {
System.out.println(5);
break;
}
case 101: {
System.out.println(6);
}
}
}
}
可以看到把char类型转换成了ASCCI码值,然后比对的是ASCCI码值。
Switch对字符串支持的实现细节
源代码:
public class SwitchTest{
public static void main(String[] args) {
String b="love";
switch (b) {
case "i":
System.out.println(1);
break;
case "love":
System.out.println(5);
break;
case "you":
System.out.println(6);
default:
break;
}
}
}
反编译后:
public class SwitchTest {
public static void main(String[] arrstring) {
String string;
String string2 = string = "love";
int n = -1;
switch (string2.hashCode()) {
case 105: {
if (!string2.equals("i")) break;
n = 0;
break;
}
case 3327858: {
if (!string2.equals("love")) break;
n = 1;
break;
}
case 119839: {
if (!string2.equals("you")) break;
n = 2;
}
}
switch (n) {
case 0: {
System.out.println(1);
break;
}
case 1: {
System.out.println(5);
break;
}
case 2: {
System.out.println(6);
}
}
}
}
可以看到进行比对的是哈希值,而且还进行了equals比较检测
参考资料: