想知道switch是怎么判断条件的吗

有一天,小A的朋友小呼面试回来,愁眉不展。

"难道面试不顺利?"小A心想。于是问小呼都问了什么。小呼说,面试官问了个奇怪的问题,

"Java的switch能不能判断string"

小呼当时就内心一喜,这不是明摆着的问题嘛!

"当然可以,java7就可以了"

"那它是怎么实现的呢"

"这个…没了解过"

面试官微微一笑,

"好的回去等通知吧"

"然后我就一直在想这个问题了",小呼说

"其实啊,你听我说…",于是小A跟小呼解释了起来

Java swtich的语法

大家都知道switch可以用在于条件判断,但是在java7之前都只能接受byte short int char,就像下面这样

public class JavaSwitch {
  public static void switchMethod(int i) {
    switch(i) {
      case 1:
        break;
       case 2:
        break;
       default:
        break;
    }
  }
}

Java7之后我们可以用String来进行判断了

public class JavaSwitch {
  public static void switchMethod(String i) {
    switch(i) {
      case "Hello":
        break;
       case "World":
        break;
       default:
        break;
    }
  }
}

那么当它比较的时候是对字符串进行比较的吗?其实不是的,我们看下编译后的字节码就明白

public static void switchMethod(java.lang.String);
   Code:
      0: aload_0
      1: astore_1
      2: iconst_m1
      3: istore_2
      4: aload_1
      5: invokevirtual #2                  // Method java/lang/String.`hashCode:()`I
      8: lookupswitch  { // 2
             69609650: 36
             83766130: 50
              default: 61
         }
     36: aload_1
     37: ldc           #3                  // String Hello
     39: invokevirtual #4                  // Method java/lang/String.`equals`:(Ljava/lang/Object;)Z
     42: ifeq          61
     45: iconst_0
     46: istore_2
     47: goto          61
     50: aload_1
     51: ldc           #5                  // String World
     53: invokevirtual #4                  // Method java/lang/String.`equals`:(Ljava/lang/Object;)Z
     56: ifeq          61
     59: iconst_1
     60: istore_2
     61: iload_2
     62: lookupswitch  { // 2
                    0: 88
                    1: 91
              default: 94
         }
     88: goto          94
     91: goto          94
     94: return
}

我们只需要注意到Sting的hashCode,还有equals方法,就能明白。进行判断的时候,首先把case里的比较条件转换成hashCode,同样的传进来的String也被转换成hashCode, 然后再进行条件判断。所以其实switch对String的判断原理,也是通过整型进行判断的。

总结

switch的判断,其实是对整型的判断。Java7中新增的对String的支持,实际上是先将String进行hashCode,然后再判断的。

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏noteless

正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素

相等的两个对象,即equals(Object)方法判断两个对象相等,那么他们必须要有相同的hashcode

22510
来自专栏Java帮帮-微信公众号-技术文章全总结

09(02)总结final,多态,抽象类,接口

(4)抽象类的练习 A:猫狗案例练习 B:老师案例练习 C:学生案例练习 D:员工案例练习 /* A: 猫狗案例 具体事物:猫,狗 共性:姓名,...

42560
来自专栏机器学习从入门到成神

几种有关排序的常见面试问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

23320
来自专栏老马说编程

计算机程序的思维逻辑 (3) - 基本运算

运算 上节我们介绍了给数据赋值,有了初始值之后,可以对数据进行运算。计算机之所以称为"计算"机,是因为发明它的主要目的就是运算。运算有不同的类型,不同的数据类型...

20290
来自专栏云霄雨霁

Java--集合类之Vector、BitSet、Stack、Hashtable

18770
来自专栏诸葛青云的专栏

简述在C语言中, “字符”与“字符串”之间的区别

在C语言中,“字符”与“字符串”之间,是有区别的。这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别。

25830
来自专栏有趣的django

8.python面向对象编程

基本概念 Class 类 一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法...

33470
来自专栏码云1024

JAVA 第二天 基本数据类型

28190
来自专栏简书专栏

Python面对对象编程

面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复填写,仅调用函数即可 面对对象:对函数进行分类和封装,让开发"更好更快...

17430
来自专栏java一日一条

Java有值类型吗?

有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Jav...

13920

扫码关注云+社区

领取腾讯云代金券