Switch 能否⽤string 做参数?
Switch 能否⽤String 做参数?
参数可以是整数表达式,JDK1.5开始⽀持Enum 类,JDK1.7开始⽀持String 。
当字符串不会频繁改变时可以⽤枚举来代替String :⽤Enum.parse 。
注意:
1.JDK1.6 的版本中,switch 后⾯的括号⾥⾯只能放int 类型的值,注意是只能放int 类型,但是放byte ,short ,char 类型的也可以。是因为byte ,short ,char 可以⾃动提升(⾃动类型转换)为int 。⽽不能放long 型和String 型。
JDK1.7 的版本中,switch 中可以使⽤字串String 。但仍不⽀持long 型。
2.String 时不能传⼊null 作为参数,同时case 语句中使⽤的字符串也不能为null ,因为底层是通过equals 和hashmap 来判断的原理:hashCode()+equals()
编译器在编译期间给代码做了转换。
switch case判断字符串
反编译后的结果:[javascript]
01. public  enum  Weekend  02. {  03.    Monday,  04.    Tuesday,  05.    Friday,  06. }  07.  08.    public  void  Test(string week)  09.    {  10.        Weekend weekend = (Weekend)Enum.Parse(typeof (Enum), week, false );//转换⼀下  11.  12.        switch  (weekend)  13.        {  14.            case  Weekend.Monday:  15.                Console.WriteLine("Today is Monday");  16.                break ;  17.            case  Weekend.Tuesday:  18.                Console.WriteLine("Today is Tuesday");  19.                break ;  20.            case  Weekend.Friday:  21.                Console.WriteLine("Today is Friday");  22.                break ;  23.            default :  24.                break ;  25.        }  26.    }
[javascript]
01. </pre><pre name="code" class ="javascript">public  class  Test {  02.  03.    public  void  test(String str) {  04.        switch (str) {  05.        case  "abc":  06.            System.out.println("abc");  07.            break ;  08.        case  "def":  09.            System.out.println("def");  10.            break ;  11.        default :  12.            System.out.println("default");  13.        }  14.    }  15.  16. }
PS  :hashcode 返回的是int 型
可以发现:进⾏switch 的实际是hash 值,然后⽤equals 进⾏安全检查(因为hash 值可能会发⽣碰撞),所以性能不如枚举。switch ⽀持String 其实是⼀个语法糖,在编译后的字节码⽂件中都会被还原成原⽣类型,并在相应位置插⼊了强制转换代码,底层的JVM 在switch 上并没有修改。
当传⼊switch 的是null 时,在运⾏时对⼀个null 调⽤hashCode()⽅法,会抛出NullPointerException ;如果case 写的是null ,那么在编译时⽆法求出hashcode ,就会编译报错。[javascript]
01. public  class  Test {  02.    public  void  test(String str) {  03.        int  i = -1;  04.        switch (str.hashCode()) {  05.        case  96354: // "abc".hashCode()  06.            if  (str.equals("abc")) {  07.              i = 0;  08.            }  09.            break ;  10.        case  99333: // "def".hashCode()  11.            if  (str.equals("def")) {  12.              i = 1;  13.            }  14.            break ;  15.        default :  16.            break ;  17.        }  18.  19.        switch (i) {  20.        case  0:  21.            System.out.println("abc");  22.            break ;  23.        case  1:  24.            System.out.println("def");  25.            break ;  26.        default :  27.            System.out.println("default");  28.        }  29.    }  30. }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。