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小时内删除。
发表评论