switch结合String使用不能传递null

switch String带来的坑:

有如下代码:

public class SwitchString {
    public static void main(String[] args) {
        method(null);
    }

    public static void method(String param) {
        switch (param) {
            case "sth":
                System.out.println("it's sth");
                break;
            case "null":
                System.out.println("it's null");
                break;
            default:
                System.out.println("default");
        }
    }
}

也许第一反应是会进default,但运行结果是抛出了空指针异常;查看一下编译后的代码就知道原因了,下面是method编译后反编译的代码:

public static void method(String param) {
    byte var2 = -1;
    switch(param.hashCode()) {
    case 114215:
        if (param.equals("sth")) {
            var2 = 0;
        }
        break;
    case 3392903:
        if (param.equals("null")) {
            var2 = 1;
        }
    }

    switch(var2) {
    case 0:
        System.out.println("it's sth");
        break;
    case 1:
        System.out.println("it's null");
        break;
    default:
        System.out.println("default");
    }
}

首先,其利用String的hashCode对其进行了一次switch case操作(空指针异常的原因就很明显了),得到一个var,再对var进行switch case;这很容易让人想到hash冲突如何解决?见以下代码:

case 3104:
    if (b.equals("aa")) {
        var4 = 1;
    } else if (b.equals("bB")) {
        var4 = 0;
    }

使用了if 结合equals来进行操作,正确性得到保证;

总结:

  1. 了解了switch对String的处理后,如果case中的选项没有出现大量的hashcode冲突的字符串时,其效率并不会被大幅降低;

  2. switch因为会对其获取hashcode,所以不能传递null,否则会抛出NPE;

你可能感兴趣的:(switch结合String使用不能传递null)