Switch 语句中的字符串如何比相应的 if-else 语句更有效?

Java文档

Java 编译器从使用 String 对象的 switch 语句生成字节码通常比从链接的 if-then-else 语句生成的字节码更有效。

AFAIK 甚至字符串在交换机内部以区分大小写的方式使用。那么,在这种情况下,它们意味着什么效率。编译速度更快?更少的字节码 ?更好的性能?.equals()


答案 1

使用 switch 语句比 equal 更快(但仅当字符串不止几个时才会明显),因为它首先使用 on 的字符串来确定可能匹配的字符串子集。如果案例标签中的多个字符串具有相同的哈希码,则 JVM 将执行顺序调用,即使大小写标签中只有一个字符串,即哈希代码,JVM 也需要调用以确认大小写标签中的字符串确实等于 switch 表达式中的字符串。hashCodeswitchequalsequals

String 对象上的开关的运行时性能与 中的查找相当。HashMap

这段代码:

public static void main(String[] args) {
    String s = "Bar";
    switch (s) {
    case "Foo":
        System.out.println("Foo match");
        break;
    case "Bar":
        System.out.println("Bar match");
        break;
    }
}

在内部编译并执行,如以下代码段所示:

(不是字面上的意思,但是如果你反编译这两段代码,你会看到完全相同的操作序列发生)

final static int FOO_HASHCODE = 70822; // "Foo".hashCode();
final static int BAR_HASHCODE = 66547; // "Bar".hashCode();

public static void main(String[] args) {
    String s = "Bar";
    switch (s.hashCode()) {
    case FOO_HASHCODE:
        if (s.equals("Foo"))
            System.out.println("Foo match");
        break;
    case BAR_HASHCODE:
        if (s.equals("Bar"))
            System.out.println("Bar match");
        break;
    }
}

答案 2

一般来说,switch 语句更好,因为它们是(松散地说),而链是O(1)if-elseO(n)

具有条件可能会导致使用链接语句进行比较。nnif-else

switch 语句可以直接“跳转到”适当的条件(如映射)或默认大小写,使其。O(1)