Switch能否用string做参数?

news/2024/12/29 17:28:15/

在JDK7以前,switch是不能够用String作为参数进行条件判断的,只能支持 byte、short、char、int或者其对应的封装类以及 enum 类型。但是在JDK之后,String作为参数是能够作为switch的参数,但是前提是你的jdk环境必须是JDK7以上的版本。
这里我们看一下代码(这里用的jdk环境为jdk1.7.0_79):

public class SwitchDemo {public static void main(String[] args) {String string = "Hello";switch (string) {case "Hello":System.out.println("Application is running on Hello mode");break;case "World":System.out.println("Application is running on World mode");break;case "Java":System.out.println("Application is running on Java mode");break;default:System.out.println("Application is running on default mode");break;}}
}

最后结果输出无疑为:Application is running on Hello mode,所以咋jdk1.7以上是能够以String作为Switch为参数的。但是值得思考的是,java中是真的支持了这一特性还是另有玄机呢,所以我们一起来看看生成的.class文件,我们利用反编译器来一探究竟:

import java.io.PrintStream;
public class SwitchDemo
{public SwitchDemo(){}public static void main(String args[]){
label0:{String string = "Hello";String s;switch ((s = string).hashCode()){default:break;case 2301506: if (!s.equals("Java"))break;System.out.println("Application is running on Java mode");break label0;case 69609650: if (s.equals("Hello")){System.out.println("Application is running on Hello mode");break label0;}break;case 83766130: if (!s.equals("World"))break;System.out.println("Application is running on World mode");break label0;}System.out.println("Application is running on default mode");}}
}

从上面反编译的代码中我们可以知道,jdk1.7并没有新的指令来处理switch string,而是通过调用switch中string.hashCode,将string转换为int从而进行判断。
最后可以得到结论:jdk1.7以后可以将String作为switch参数进行传递,其原理就是将字符串转换成hashCode值,然后在进行equals比较,也就是编译器在编译期间给代码做了转换。


http://www.ppmy.cn/news/233638.html

相关文章

C/C++ switch()参数类型

关于switch的参数类型 switch(expr1)中,expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。 由于,byte,short,char都可以隐含转换为…

switch vba_VBA switch

switch函数的功能是:计算一组表达式列表的值,然后返回与表达式列表中最先为 True 的表达式所相关的 Variant 数值或表达式。 一、switch语法 Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]]) Switch 函数的语法具有以下几个部分&#…

ElementUI中switch回调函数change的参数问题

更多内容请访问ElementUI官网 需求说明 八个switch组件,用同一个回调函数switch组件状态发生变化时需要知道它目前开关状态需要知道当前是哪个switch 问题描述 按照官方文档对switch事件的描述 事件名称说明回调参数changeswitch 状态发生变化时的回调函数新状态的值 下面…

关于Switch的参数

在jdk 1.7之前: switch只能传入int类型,由于char,short,byte的的精度比int小,所以可以默认转化为int类型 string,long,boolean,float精度比int大,所以无法作为参数 在…

不能做switch()的参数类型

switch后面只能带可以自动转换为整形(包括整形)的类型,不能为实型。 具体如下: C/C中: 支持类型:byte,char,short,int,long,bool,枚举类型。 不支持的类型:float,double,string Java中: A swi…

switch接受的参数类型

java的switch-case语句格式如下: [java] view plain copy switch(参数) { case 常量表达式1: break; case 常量表达式2: break; ... default: break; } 注意的地方: switch接受的参数类型有10种,分别是基本类型…

java的switch参数问题

switch参数仅支持整数表达式,也可以说是int型,包含int,short,byte,char和枚举(值为int);因为short,byte,char都能自动转换为int型,所以long,String不行&#…

C语音switch参数的类型问题

标准定义:switch 语句后面的表达式可以是整型,字符型,枚举型 因为byte能够无损的转换为int,但是如果是long类型,转换会有丢失,所以不行