首页 > 试题广场 >

java7后关键字 switch 支不支持字符串作为条件:(

[单选题]

java7后关键字 switch 支不支持字符串作为条件:()

  • 支持
  • 不支持
推荐

在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。在Java7中,呼吁很久的String支持也终于被加上了。

在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointerException。在case子句中也不能使用null,否则会出现编译错误。

同时,case字句的值是不能重复的。对于字符串类型的也一样,但是字符串中可以包含Unicode转义字符。重复值的检查是在Java编译器对Java源代码进行相关的词法转换之后才进行的。也就是说,有些case字句的值虽然在源代码中看起来是不同的,但是经词法转换之后是一样的,就会在成编译错误。比如:“男”和“\u7537”就是一个意思。

然后看一个源代码及反编译后的代码:

public class StringForSwitch {
    public void test_string_switch() {
        String result="";  
        switch ("doctor") {
        case "doctor":
            result = "doctor";
            break;
        default:
            break;
        }
    }
}

反编译后的,还原成大致的Java的代码如下:

public class StringForSwitch {
    public StringForSwitch() {
    }
    public void test_string_switch() {
        String result = "";
        String var2 = "doctor";
        switch("doctor".hashCode()) {
        case -1326477025:
            if(var2.equals("doctor")) {
                result = "doctor";
            }
        default:
           break;
        }
    }
}

可以看出,字符串类型在switch语句中利用hashcode的值与字符串内容的比较来实现的;但是在case字句中对应的语句块中仍然需要使用String的equals方法来进一步比较字符串的内容,这是因为哈希函数在映射的时候可能存在冲突。

编辑于 2017-03-17 23:17:53 回复(4)
选A
看了一下,这个题大家都说的不是很全面。
switch(exp),在JDK7之前,只能是byte、short、char、int或者对应的包装类,或者枚举常量(内部也是由整型或字符类型实现)。
为什么必须是这些呢,因为其实exp只是对int型支持的,其他都是因为可以自动拆卸或者自动向上转型到int,所以才可以。
到了JDK7的时候,String被引入了,为什么String能被引入呢?
其实本质上还是对int类型值得匹配。
原理如下,通过对case后面得String对象调用hashCode方法,得到一个int类型得hash值,然后用这个hash值来唯一标识这个case。那么当匹配时,首先调用exp的hashCode,得到exp的hash值,用这个hash值来匹配所有case,如果没有匹配成功,就说明不存在;如果匹配成功了,接着会调用字符串的equals方法进行匹配。(hash值一致,equals可不一定返回的就是true)。
所以,exp不能为null,cas子句使用的字符串也不能为null,不然会出现空指针异常。
发表于 2018-07-13 11:05:04 回复(4)
你问我支持不支持,我当然是支持的。
发表于 2017-05-06 09:51:20 回复(13)

  • java7前支持: byte,short,int ,char,枚举
  • java7之后支持: String
  • 反正就是不支持  boolean


编辑于 2019-03-29 12:41:52 回复(0)
这道题出的不是很严谨,在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。但是在Java7中,也支持了String类型。题目在考察时一般是在考察java7之前的类型。
发表于 2016-12-12 14:40:14 回复(1)

你们问我支不支持,我当然是支持的,它是String,我们怎么能不支持。我要不支持,你们又不高兴,天天嚷要新特性。你们这些学Java的,有一点比学C的好,哪里对象去世了,GC回收的比谁都快,但代码跑来跑去都too slow too oop,sometimes 为了加快运行速度还要用native,隔壁的C++比你们不知道搞到哪里去了。

发表于 2019-08-07 22:44:30 回复(2)
在Java7之前,Switch支持的条件类型: byte,short,chart,int,enum以及基本类型的封装类,在Java7之后,开始支持字符串类型。
发表于 2017-06-20 10:27:44 回复(0)
Java7之后,switch支持int、short、char、byte、枚举类型以及(字符串字面量 <- Java7之前没有)
发表于 2020-04-24 15:03:06 回复(0)
switch case在jdk1.7中加入了对String类型的支持,支持的类型包括:char、byte、short、int和Character、Byte、Short、Integer、String
编辑于 2020-01-22 09:30:31 回复(0)
JDK7及其后续版本switch支持字符串类型的传入
发表于 2019-11-08 15:46:52 回复(0)
在java7之间,switch只能支持byte,short,char,int或者其对应的封装类以及Enum类型
在java7之后,switch支持了String类型
编辑于 2018-11-06 19:49:32 回复(0)
JDK1.7以后已经支持字符串类型了
发表于 2016-12-12 21:44:49 回复(0)
规定:在Jav7之前,支持byte,short,int,char以及它们的包装类和枚举类型。Java7后新增了String类型。
特性:switch的值不能是null,运行时抛出NullPointerException;case不能使用null,会出现编译错误;case的值是不能重复。
原理:对String的支持本质也是int类型的匹配,因为会对case后面的String对象调用hashcode()方法,返回一个int类型哈希值,唯一标识这个case。 当对字符串进行匹配时,首先调用hashcode()方法,获取到int类型的hash值,用来匹配所以的case。如果没有匹配成功,说明没有这个字符串; 如果匹配成功则调用equals()方法匹配字符串。这是因为不同的字符串可能拥有相同的hash值。
发表于 2023-03-11 20:08:18 回复(0)

不知道大家是怎么记的,这种我都是死记硬背啊,大家有什么好方法么🤯

发表于 2020-02-27 18:11:39 回复(1)
Java5之后添加了枚举,Java7之后添加了字符串。
发表于 2017-10-20 09:16:06 回复(0)
switch是对int支持,那么byte short char 枚举 或者对应的包装类java7堆string支持了,先会调用hashcode,比对的之后,会比较equals
编辑于 2024-02-15 22:46:35 回复(0)
在jdk1.7及其之后是支持了String了,以前是只支持 byte、short、int、char;
对String的支持本质也是int类型的匹配,这是因为会对case后面的String对象调用hashcode()方法,返回一个int类型哈希值,唯一标识这个case。 当对字符串进行匹配时,首先调用hashcode()方法,获取到int类型的hash值,用来匹配所以的case。如果没有匹配成功,说明没有这个字符串;如果匹配成功则调用equals()方法匹配字符串。这是因为不同的字符串可能拥有相同的hash值。
发表于 2023-05-30 10:16:12 回复(0)
Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。
从 Java 5 开始,Java 中引入了枚举类型, expr 也可以是 enum 类型。
从 Java 7 开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
发表于 2022-02-04 00:01:23 回复(0)
java1.7以后支持啊!
发表于 2022-01-06 16:34:05 回复(0)
在Jav7之前,支持byte,short,int,char以及它们的包装类和枚举类型。Java7后新增了String类型。 对String的支持本质也是int类型的匹配,这是因为会对case后面的String对象调用hashcode()方法,返回一个int类型哈希值,唯一标识这个case。 当对字符串进行匹配时,首先调用hashcode()方法,获取到int类型的hash值,用来匹配所以的case。如果没有匹配成功,说明没有这个字符串;如果匹配成功则调用equals()方法匹配字符串。这是因为不同的字符串可能拥有相同的hash值。
发表于 2021-12-11 17:29:37 回复(0)
switch语句后面在JDK7以后可以支持byte,short,char,int或者对应的包装类,或者枚举常量(内部也是由整型或字符类型实现),还引入了String
发表于 2021-09-18 16:54:58 回复(0)