栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在Java 7中switch语句比String语句要快?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在Java 7中switch语句比String语句要快?

Java代码

具有一个类的两个版本,例如

if-then-else

public class IfThenElseClass {    public static void main(String[] args) {        String str = "C";        if ("A".equals(str)) {        } else if ("B".equals(str)) {        } else if ("C".equals(str)) {        }    }}

switch

public class SwitchClass {    public static void main(String[] args) {        String str = "C";        switch (str) { case "A":     break; case "B":     break; case "C":     break;        }    }}

字节码

让我们看一下字节码。获取

if-then-else
版本的字节码:

Compiled from "CompileSwitch.java"public class CompileSwitch {  public CompileSwitch();    Code:       0: aload_0       1: invokespecial #8  // Method java/lang/Object."<init>":()V       4: return  public static void main(java.lang.String[]);    Code:       0: ldc#16 // String C       2: astore_1       3: ldc#18 // String A       5: aload_1       6: invokevirtual #20 // Method java/lang/String.equals:(Ljava/lang/Object;)Z       9: ifne          28      12: ldc#26 // String B      14: aload_1      15: invokevirtual #20 // Method java/lang/String.equals:(Ljava/lang/Object;)Z      18: ifne          28      21: ldc#16 // String C      23: aload_1      24: invokevirtual #20 // Method java/lang/String.equals:(Ljava/lang/Object;)Z      27: pop      28: return}

获取

switch
版本的字节码:

Compiled from "CompileSwitch.java"public class CompileSwitch {  public CompileSwitch();    Code:       0: aload_0       1: invokespecial #8 // Method java/lang/Object."<init>":()V       4: return  public static void main(java.lang.String[]);    Code:       0: ldc#16 // String C       2: astore_1       3: aload_1       4: dup       5: astore_2       6: invokevirtual #18 // Method java/lang/String.hashCode:()I       9: lookupswitch  { // 3         65: 44         66: 56         67: 68    default: 77          }      44: aload_2      45: ldc#24 // String A      47: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z      50: ifne          77      53: goto          77      56: aload_2      57: ldc#30 // String B      59: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z      62: ifne          77      65: goto          77      68: aload_2      69: ldc#16 // String C      71: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z      74: ifne          77      77: return}

结论

  • 在第一个版本中,通过

    equals
    为每个条件调用方法来比较字符串,直到找到为止。

  • 在第二个版本中,首先

    hashCode
    获取字符串。然后,这是与值
    hashCode
    的每个
    case
    。请参阅
    lookupswitch
    。如果重复这些值中的任何一个,则恰好为该代码运行代码
    case
    。否则,调用
    equals
    捆绑方法的情况。这比
    equals
    仅调用该方法快得多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/498309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号