switch 语句中的 String 为何比相应的 if-else 语句更高效?

2024-04-12

Java 文档 http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html says

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

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


使用 switch 语句比 equals 更快(但只有当字符串不止几个时才明显),因为它首先使用hashCode的字符串switch来确定可能匹配的字符串子集。如果 case 标签中的多个字符串具有相同的 hashCode,则 JVM 将执行顺序调用equals即使 case 中只有一个字符串标记为 hashCode,JVM 也需要调用equals确认 case 标签中的字符串确实等于 switch 表达式中的字符串。

String 对象上的 switch 的运行时性能与 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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

switch 语句中的 String 为何比相应的 if-else 语句更高效? 的相关文章

随机推荐