Switch 语句中的字符串如何比相应的 if-else 语句更有效?
2022-08-31 15:36:25
Java 编译器从使用 String 对象的 switch 语句生成字节码通常比从链接的 if-then-else 语句生成的字节码更有效。
AFAIK 甚至字符串在交换机内部以区分大小写的方式使用。那么,在这种情况下,它们意味着什么效率。编译速度更快?更少的字节码 ?更好的性能?.equals()
Java 编译器从使用 String 对象的 switch 语句生成字节码通常比从链接的 if-then-else 语句生成的字节码更有效。
AFAIK 甚至字符串在交换机内部以区分大小写的方式使用。那么,在这种情况下,它们意味着什么效率。编译速度更快?更少的字节码 ?更好的性能?.equals()
使用 switch 语句比 equal 更快(但仅当字符串不止几个时才会明显),因为它首先使用 on 的字符串来确定可能匹配的字符串子集。如果案例标签中的多个字符串具有相同的哈希码,则 JVM 将执行顺序调用,即使大小写标签中只有一个字符串,即哈希代码,JVM 也需要调用以确认大小写标签中的字符串确实等于 switch 表达式中的字符串。hashCode
switch
equals
equals
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;
}
}
一般来说,switch 语句更好,因为它们是(松散地说),而链是O(1)
if-else
O(n)
具有条件可能会导致使用链接语句进行比较。n
n
if-else
switch 语句可以直接“跳转到”适当的条件(如映射)或默认大小写,使其。O(1)