Java学习笔记 (八) 反编译 switch 观察其实现细节

看了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比较检测

参考资料:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值