Switch能否用string做参数?

本文介绍Java中使用Switch语句处理String参数的方法,包括不同JDK版本的支持情况、使用枚举代替字符串的技巧以及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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() 
编译器在编译期间给代码做了转换。

[javascript]  view plain  copy
  1. public enum Weekend  
  2. {  
  3.     Monday,  
  4.     Tuesday,  
  5.     Friday,  
  6. }  
  7.   
  8.     public void Test(string week)  
  9.     {  
  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]  view plain  copy
  1. </pre><pre name="code" class="javascript">public class Test {  
  2.   
  3.     public void test(String str) {  
  4.         switch(str) {  
  5.         case "abc":  
  6.             System.out.println("abc");  
  7.             break;  
  8.         case "def":  
  9.             System.out.println("def");  
  10.             break;  
  11.         default:  
  12.             System.out.println("default");  
  13.         }  
  14.     }  
  15.   
  16. }  

反编译后的结果:

[javascript]  view plain  copy
  1. public class Test {  
  2.     public void test(String str) {  
  3.         int i = -1;  
  4.         switch(str.hashCode()) {  
  5.         case 96354: // "abc".hashCode()  
  6.             if (str.equals("abc")) {  
  7.               i = 0;  
  8.             }  
  9.             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. }  
PS :hashcode返回的是int型
可以发现:进行switch的实际是hash值,然后用equals进行安全检查(因为hash值可能会发生碰撞),所以性能不如枚举。switch支持String其实是一个语法糖,在编译后的字节码文件中都会被还原成原生类型,并在相应位置插入了强制转换代码,底层的JVM在switch上并没有修改。

当传入switch的是null时,在运行时对一个null调用hashCode()方法,会抛出NullPointerException;如果case写的是null,那么在编译时无法求出hashcode,就会编译报错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值