switch能用在String上吗?

软件求生 2024-11-24 10:31:32

 Hi,大家好!我是小米,一个喜欢分享技术干货的程序员。今天,我们来聊聊 Java 中一个经常被问到却容易出错的知识点:switch 语句。这个小问题可不简单,稍有不注意,就可能成为面试中的“绊脚石”。尤其是面试官常会问你: switch 是否能作用在 byte 上? switch 是否能作用在 long 上? switch 是否能作用在 String 上? 你是不是也被这几个问题困扰过?别急,今天我们就来深入剖析这个问题,从原理到实践,让你彻底掌握! switch 的基本原理 switch 是什么? 在 Java 中,switch 是一个条件分支语句,它通过对一个表达式的值进行匹配来执行对应的代码块。它的语法结构如下:

注意:case 后的值必须是 常量 或 编译时可确定的值,不能是变量或表达式。 switch 的适用类型 在 Java 的不同版本中,switch 的适用数据类型有所不同: JDK 1.4 及之前:只支持 整数类型(byte、short、int 和对应的包装类,以及 char)。 JDK 1.5:引入了自动装箱,依然只支持上述类型。 JDK 1.7:开始支持 String 类型。 JDK 14(预览功能):引入了 switch 表达式,更加简洁灵活,但适用数据类型未变。 switch 能否作用在 byte 上? 答案是:可以! 因为 byte 是整数类型的一种,而 switch 在 JDK 1.4 及之后版本都支持整数类型,所以 byte 完全没问题。来看个简单的例子:

运行结果:这是 case 2 这里需要注意的是,case 的值必须在 byte 的范围内(-128 到 127),否则会报编译错误。 switch 能否作用在 long 上? 答案是:不可以! 这是因为 switch 在底层依赖于字节码指令 tableswitch 和 lookupswitch,它们只支持 int 及以下类型。long 超出了支持范围,所以会直接报编译错误。来看个例子:

编译报错: incompatible types: possible lossy conversion from long to int 解决方法: 如果一定要用 long,可以用 if-else 替代 switch,或者将 long 转为 int(但需注意可能的溢出问题)。 switch 能否作用在 String 上? 答案是:可以(JDK 1.7 及之后版本)! 在 JDK 1.7 中,switch 增加了对 String 类型的支持。这是通过将 String 的值转化为其对应的 hashCode 来实现的,但在底层会有额外的字符串比较以确保精确匹配。来看一个例子:

运行结果:这是 hello 注意事项: case 中的字符串是区分大小写的,"hello" 和 "Hello" 是不同的值。 若 switch 的表达式为 null,则会抛出 NullPointerException,所以需要提前检查。 总结对比

面试中可能的延伸问题 1. 为什么 switch 不支持 long? 答:因为 switch 底层依赖的字节码指令不支持 long 类型,且 long 的范围太大,不适合通过查表或跳转来实现匹配。 2. String 类型的 switch 比 if-else 性能更高吗? 答:通常情况下,switch 会更高效一些,因为它利用了 hashCode 和跳转表。但在 case 比较特别多时,性能差距可能不明显。 3. 如何避免 null 引发的 NullPointerException? 答:在使用 switch 时,先检查变量是否为 null,比如:

END switch 是 Java 中一个非常常用的分支语句,但它的适用类型有严格的限制,尤其是在面试中,byte、long 和 String 的问题特别容易被问到。希望今天的分享能让你彻底搞清楚这个知识点! 如果你觉得这篇文章对你有帮助,记得 点赞、转发 和 收藏 哦!你的支持是我持续输出的最大动力!我们下期再见,Bye~ 我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!

0 阅读:9
软件求生

软件求生

从事软件开发,分享“技术”、“运营”、“产品”等。