Java 语法糖 - switch 匹配字符串

Java About 2,286 words

本质

switch匹配字符串本质是先通过比较输入字符串的hashCode和分支条件对应的字符串的hashCode是否相同,相同再使用equals比较字符串是否相同。

取得的临时int类型后,再使用switch匹配临时变量的值。

结论:先switch匹配int类型字符串hashCode,再switch匹配int类型临时变量。

面试题

问:为什么先hashCodeequals

答:防止哈希冲突。

示例一

Java 代码

public class Test6 {
    public void choose(String keywords) {
        switch (keywords) {
            case "hello":
                System.out.println("h");
                break;
            case "world":
                System.out.println("w");
                break;
            default:
                System.out.println("default");
        }
    }
}

反编译 class

public class Test6 {
    public Test6() {
    }

    public void choose(String keywords) {
        byte var3 = -1;
        switch(keywords.hashCode()) {
        case 99162322:
            if (keywords.equals("hello")) {
                var3 = 0;
            }
            break;
        case 113318802:
            if (keywords.equals("world")) {
                var3 = 1;
            }
        }

        switch(var3) {
        case 0:
            System.out.println("h");
            break;
        case 1:
            System.out.println("w");
            break;
        default:
            System.out.println("default");
        }

    }
}

示例二

示例二中字符串BMC.的两个hashCode相同,所以进入同一分支,再进行equals判断。

Java 代码

public class Test7 {
    public void choose(String keywords) {
        switch (keywords) {
            case "BM":
                System.out.println("BM");
                break;
            case "C.":
                System.out.println("C.");
                break;
            default:
                System.out.println("default");
        }
    }

反编译 class

public class Test7 {
    public Test7() {
    }

    public void choose(String keywords) {
        byte var3 = -1;
        switch(keywords.hashCode()) {
        case 2123:
            if (keywords.equals("C.")) {
                var3 = 1;
            } else if (keywords.equals("BM")) {
                var3 = 0;
            }
        default:
            switch(var3) {
            case 0:
                System.out.println("BM");
                break;
            case 1:
                System.out.println("C.");
                break;
            default:
                System.out.println("default");
            }

        }
    }
}
Views: 3,117 · Posted: 2022-04-24

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh