Java 面试必备:switch 究竟能不能用在 long 和 String 上?
Hi,大家好!我是小米,一个喜欢分享技术干货的程序员。今天,我们来聊聊 Java 中一个经常被问到却容易出错的知识点:switch 语句。这个小问题可不简单,稍有不注意,就可能成为面试中的“绊脚石”。尤其是面试官常会问你:
- switch 是否能作用在 byte 上?
- switch 是否能作用在 long 上?
- switch 是否能作用在 String 上?
你是不是也被这几个问题困扰过?别急,今天我们就来深入剖析这个问题,从原理到实践,让你彻底掌握!
switch 是什么?
在 Java 中,switch 是一个条件分支语句,它通过对一个表达式的值进行匹配来执行对应的代码块。它的语法结构如下:
注意:case 后的值必须是 常量 或 编译时可确定的值,不能是变量或表达式。
在 Java 的不同版本中,switch 的适用数据类型有所不同:
- JDK 1.4 及之前:只支持 整数类型(byte、short、int 和对应的包装类,以及 char)。
- JDK 1.5:引入了自动装箱,依然只支持上述类型。
- JDK 1.7:开始支持 String 类型。
- JDK 14(预览功能):引入了 switch 表达式,更加简洁灵活,但适用数据类型未变。
答案是:可以!
因为 byte 是整数类型的一种,而 switch 在 JDK 1.4 及之后版本都支持整数类型,所以 byte 完全没问题。来看个简单的例子:
运行结果:这是 case 2
这里需要注意的是,case 的值必须在 byte 的范围内(-128 到 127),否则会报编译错误。
答案是:不可以!
这是因为 switch 在底层依赖于字节码指令 tableswitch 和 lookupswitch,它们只支持 int 及以下类型。long 超出了支持范围,所以会直接报编译错误。来看个例子:
编译报错:
incompatible types: possible lossy conversion from long to int
解决方法:
如果一定要用 long,可以用 if-else 替代 switch,或者将 long 转为 int(但需注意可能的溢出问题)。
答案是:可以(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,比如:
switch 是 Java 中一个非常常用的分支语句,但它的适用类型有严格的限制,尤其是在面试中,byte、long 和 String 的问题特别容易被问到。希望今天的分享能让你彻底搞清楚这个知识点!
如果你觉得这篇文章对你有帮助,记得 点赞、转发 和 收藏 哦!你的支持是我持续输出的最大动力!我们下期再见,Bye~
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
共2400页!又一个Java面试神器上线了
大家好,最近有不少小伙伴在后台留言,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些程序员了。
这不,为了帮大家节约时间,给大家搞来了今年上半年碰到的大厂Java面试题合集,内容非常的全面。
一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。
比如果这样的问题:
- 项目框架,Spring、Mybatis 等框架实现原理是否熟悉?
- 消息中间件,负载均衡、RPC 框架等技术是否有接触过?MySQL 分库分表是否做过?
- 分布式架构设计,Redis 分布式锁是否有涉及?
- ……(此处省略 1W 字)
很多时候,面试官问的问题会和自己准备的“题库”中的问题不太一样,即使做了复盘,下次面试还是不知道该从何处下手。
为此我专门整理了一份《Java进阶学习+面试宝典》分享给大家,内容涵盖:计算机基础、Java、JVM、spring、算法、微服务、分布式、大厂面经、技术脑图等等…共1600+页 质量非常高!!!
不管最近要不要去面试,建议大家都保存一份!!学完之后不论是 厂内晋升 还是 跳槽涨薪 都不在话下!
内容如下:
- 大厂面试题真题解析(38页)
- JVM(183页)
- 多线程(221页)
- Mysql(216页)
- Spring(338页)
- Spring Boot(41页)
- 经典面试题(35页)
- Spring Cloud(50页)
- Dubbo(55页)
- Mybtis+Redis(27页)
- Linux+网络(66页)
- MQ+Kafka+Zookeeper(40页)
- Netty(21页)
- 大数据+hadoop(31页)
- 算法(38页)
- 设计模式+项目+高并发(41页)
注:篇幅有限,资料已整理成文档,私信【面试】领取!
注意!限今天
京东篇:
美团篇:
阿里篇:
注:(以上面经不含解析 资料中已涵盖!)
一、基础篇:2022版
(含:Java概述,语法,面向对象,IO流,API,集合,NIO,HashMap,基础常见面试题….)
二、设计模式篇:2022版
(含:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式,适配器模式,装饰器模式,代理模式等23种设计模式…)
注:篇幅有限,资料已整理成文档,私信【面试】领取!
三、经典面试题篇:2022版
(含:22大问题,从基础到高级,BATJ面试常问的点…)
四、JVM篇:2022版
(含:JVM虚拟机,内存模型,GC算法,性能调优,源码分析,老年代和新生代,JVM常见面试题…)
五、算法篇:2022版
(大厂必备算法!含:红黑树,B+树,贪心算法,哈希分治法,七大查找算法,动态规划,一致性算法,数据结构等…)
六、分布式篇:2022版
(含:分布式系统原,数据分布式方式,基本副本协议,Lease机制,Dubbo,集群,分布式锁,等…)
注:篇幅有限,资料已整理成文档,私信【面试】领取!
七、Spring篇:2022版
(含:spring原理,spring AOP的实现原理和常见,spring 5,spring IOC,springMVC,事务管理,MVC框架等…)
八、Mysql篇:2022版
(含:mysql数据库基础知识,数据类型,失误,试图,mysql索引,mysql锁,mysql优化,等…)
九、Dubbo篇:2022版
(含:Dubbo基础,架构设计,集群,配置,通信协议,SPI,等…)
十、计算机网络篇:2022版
(含:网络协议,TCP/IP系统结构,TCP/IP协议族,常见面试题,等…)
注:篇幅有限,资料已整理成文档,私信【面试】领取!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。