Ani*_*kur 60 java string if-statement switch-statement
Java编译器通常使用String对象生成比使用链式if-then-else语句更高效的字节码.
AFAIK even String in switch在.equals()
内部以区分大小写的方式使用.那么它们在这种背景下的效率是多少.编译速度更快?字节码少?更好的性能?
Erw*_*idt 74
使用switch语句比equals更快(但只有在不止一些字符串时才会显着)因为它首先使用on hashCode
的字符串switch
来确定可能匹配的字符串子集.如果case标签中的多个字符串具有相同的hashCode,则JVM将执行顺序调用equals
,即使在case标签中只有一个字符串表示hashCode,JVM需要调用equals
以确认该字符串是否为case label实际上等于switch表达式中的label.
String对象上的开关的运行时性能与a中的查找相当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;
}
}
Run Code Online (Sandbox Code Playgroud)
在内部编译并执行像这段代码:
(不是字面意思,但是如果你反编译两段代码,你就会看到完全相同的动作序列发生)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Tyl*_*ler 20
在一般,开关语句是更好,因为它们是(严格意义上)O(1)
,而链if-else
是O(n)
有n
可能导致高达条件下n
使用链式比较if-else
报表.
switch语句可以直接"跳转"到适当的条件(如地图)或默认情况下制作它O(1)
.
这是从docs中的示例生成的字节码片段:
INVOKEVIRTUAL java/lang/String.hashCode ()I
LOOKUPSWITCH
-2049557543: L2
-1984635600: L3
-1807319568: L4
Run Code Online (Sandbox Code Playgroud)
与if-else逻辑相比,使用LOOKUPSWITCH具有更好的性能