Switch能否用String做参数?

参数可以是整数表达式,JDK1.5开始支持Enum类,JDK1.7开始支持String。

当字符串不会频繁改变时可以用枚举来代替String:用Enum.parse。

    public enum Weekend{Monday,Tuesday,Friday,}public void Test(string week){Weekend weekend = (Weekend)Enum.Parse(typeof(Enum), week, false);//转换一下switch (weekend){case Weekend.Monday:Console.WriteLine("Today is Monday");break;case Weekend.Tuesday:Console.WriteLine("Today is Tuesday");break;case Weekend.Friday:Console.WriteLine("Today is Friday");break;default:break;}}

注意:

1.整数表达式可以是int和Integer,而byte、short、char等可以转换成int,所以也可以用。但是long和String不能转换成int,所以不能用

2.String时不能传入null作为参数,同时case语句中使用的字符串也不能为null,因为底层是通过equals和hashmap来判断的

</pre><pre name="code" class="javascript">public class Test {public void test(String str) {switch(str) {case "abc":System.out.println("abc");break;case "def":System.out.println("def");break;default:System.out.println("default");}}}

反编译后的结果:

public class Test {public void test(String str) {int i = -1;switch(str.hashCode()) {case 96354: // "abc".hashCode()if (str.equals("abc")) {i = 0;}break;case 99333: // "def".hashCode()if (str.equals("def")) {i = 1;}break;default:break;}switch(i) {case 0:System.out.println("abc");break;case 1:System.out.println("def");break;default:System.out.println("default");}}
}

PS:hashcode返回的是int型
可以发现:进行switch的实际是hash值,然后用equals进行安全检查(因为hash值可能会发生碰撞),所以性能不如枚举。switch支持String其实是一个语法糖,在编译后的字节码文件中都会被还原成原生类型,并在相应位置插入了强制转换代码,底层的JVM在switch上并没有修改。

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

Switch用String做参数相关推荐

  1. Switch能否用string做参数?

    在JDK7以前,switch是不能够用String作为参数进行条件判断的,只能支持 byte.short.char.int或者其对应的封装类以及 enum 类型.但是在JDK之后,String作为参数 ...

  2. Switch可以用string做参数吗

    在jdk1.7 之前,switch 只能支持 byte.short.char.int 这几个基本数据类型和其对应的封装类型.switch后面的括号里面只能放int类型的值,但由于byte,short, ...

  3. 2. Switch能否用String做参数?

    Switch语句的参数类型 JDK1.6 的版本中,switch后面的括号里面只能放int类型的值, 注意是只能放int类型,但是放byte,short,char类型的也可以.是因为byte,shor ...

  4. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...

    题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...

  5. IDEA使用switch传入String编译不通过

    今天在使用IDEA的时候,用到switch分支语句,传入String参数的时候一直报错,下面是源码报错截图: 看错误提示并没有提到switch支持String类型,不过ava1.7之后就支持Strin ...

  6. [基础题]2.(*)利用接口做参数,写个计算器,能完成加减乘除运算。

    /*2.(*)利用接口做参数,写个计算器,能完成加减乘除运算. (1)定义一个接口Compute含有一个方法int computer(int n, int m). (2)设计四个类分别实现此接口,完成 ...

  7. 关于C#的Main(String[] args)参数输入问题

    指定相关的测试代码 首先,写一个用于测试的关于Main(String[] args)参数输入有关的代码类,如下: using System; public class Hello {     publ ...

  8. 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分

    代码 /*第二题:利用接口做参数,写个计算器,能完成加减乘除运算.(1)定义一个接口Compute含有一个方法int computer(int n, int m).(2)设计四个类分别实现此接口,完成 ...

  9. Java 接口做参数,接口回调

    JAVA接口做参数,接口回调 接口做参数:将实现某接口的类的对象的引用用作参数传递给该接口参数.该接口通过回调来实现该接口方法. 接口回调:实现某接口的类的对象的引用,赋值给该接口声明的接口变量. 难 ...

最新文章

  1. Eclipse将android 类编译为jar类库
  2. 算法----实现strStr 函数
  3. 关于table和td的边框设置
  4. ImportError: No module named sklearn.metrics
  5. linux grep命令详解_Linux 上USB 调试神器lsusb命令详解
  6. zoj 3209 Dancing links/hust 1017
  7. html语言可以干什么,JavaScript语言能做什么?
  8. 数值分析 python_数值分析python代码
  9. 百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp)
  10. ROS:激光雷达+laser_scan_matcher 运行gmapping
  11. CSS里 @import用法
  12. Win10/Win11:恢复Win7照片查看器
  13. php mds函数,MDSRank类解析 - linux_hunter的个人页面 - OSCHINA - 中文开源技术交流社区...
  14. [网络流24题] 06 最长递增子序列(最多不相交路径,最大流)
  15. 5.Python格式化输出
  16. 求两个正整数的最大公约数和最小公倍数
  17. 火狐浏览器Firefox上DownThemAll插件
  18. Linux下cp命令
  19. Python学习笔记 - Python语言概述和开发环境
  20. xwiki部署_开源Wiki应用平台---XWiki的部署

热门文章

  1. python 学习分享之简单的播放音乐1(playsound)
  2. 1、每天学习一点点之 contenteditable 属性
  3. Golang 在linux中新建用户
  4. 前端知识总结汇总!(HTML、CSS、JS、jQuery、vue、微信小程序)
  5. MSDN如何找到和打开
  6. 安装 Black Duck
  7. Java基础知识思维导图
  8. c语言线程邮箱解决资源竞争问题
  9. 3万元微型电动车,能否成为蔚来的“回港”利器?
  10. Java 悲观锁和乐观锁的实现