why哥被阿里一道基础面试题给干懵了,一气之下写出万字长文。 (2)

简介: why哥被阿里一道基础面试题给干懵了,一气之下写出万字长文。 (2)

Otherwise,就是否则的意思。带入上下文也就是说前面的表达式是正常计算出来了一个东西了。


那么就拿着计算出来的这个东西(表达式的值)和每一个 case 里面的常量来对比,会出现以下的情况:


  • 如果表达式的值和其中一个 case 语句中的常量相等了,那么我们就说 case 语句匹配上了。switch 代码块中匹配的 case 语句之后的所有语句 (如果有)就按照顺序执行。如果所有语句都正常完成,或者在匹配的 case 语句之后没有语句,那么整个 switch 代码块就将正常完成。


  • 如果没有和表达式匹配的 case 语句,但是有一个 default 语句,那么 switch 代码块中 default 语句后面的所有语句(如果有)将按顺序执行。如果所有语句都正常完成,或者如果 default 标签之后没有语句了,则整个 switch 代码块就将正常完成。


  • 如果既没有 case 语句和表达式的值匹配上,也没有 default 语句,那就没有什么搞的了,switch 语句执行了个寂寞,也算是正常完成。


其实到这里,上面的情况一不就是阿里巴巴 Java 开发手册的面试题的场景吗?


你看着代码,再看着翻译,仔细的品一品。


为什么那道面试题的输出结果是这样的:


image.png


没有为什么,Java 语言规范里面就是这样规定的,按照规定执行就完事了。


除了上面这三种流程,官网上还接着写了三句话:


image.png


如果 switch 语句块里面包含任何的表示或者意外导致立即完成的语句,则按如下方式处理:


我先说一下我理解的官方文档中说的:“any statement immediately ... completes abruptly”。


表示立即完成的语句就是每个 case 里面的 break、return。


意外导致突然完成的语句就是在 switch 语句块里面任何会抛出异常的代码。


如果出现了这两种情况,switch 语句块怎么处理呢?


如果语句的执行由于 break 语句而完成,则不会采取进一步的操作(进一步操作是指如果没有 break 代码,则将继续执行后续语句),switch 语句块将正常完成。


如果语句的执行由于任何其他原因突然完成(比如抛出异常),switch 语句块也会因相同的原因而立马完成。


上面就是 switch 语句的执行流程。所以你还别觉得 switch 语句就必须要个 break,别人的设计就是如此,看场景的。


比如看官方给出的两个示例代码:


image.png


这是不带 break 的。需求就要求这样输出,你整个 break 干啥。



再看另外一个带 break 的:


image.png


实现的又是另外一个需求了。


所以,看场景。


另外,我觉得官网上的这个例子给的不好。最后少了一个 default 语句。看看阿里 Java 开发手册上怎么说的:


image.png



这个地方见仁见智吧。


底层技术实现


第二个考点是底层技术实现。


也就下面这坨代码:


image.png


前面讲了哈,官方文档里面有这样的一句话:


image.png


规定如此。


所以,这小节的答案是这样的吗?肯定不是的,我们多想一步:


为什么这样规定呢?


这才是这小节想要带大家寻找的东西。


首先你得知道 switch 支持 String 是 Java 的一颗语法糖。既然是语法糖, 我们就看看它的 class 文件:


微信图片_20220426222051.png


从 class 文件中,我们尝到了这颗语法糖的味道。原来实际上是有两个 switch 操作的。


switch 支持 String 类型的原因是先取的 String 的 hashCode 进行 case 匹配,然后在每个 case 里面给 var3 这个变量赋值。然后再对 var3 进行一次 switch 操作。


所以,上图中标记的 15 行,如果 String 是 null,那么对 null 取 hashCode ,那可不得抛出空指针异常吗?


所以,你看《Java开发手册》里面的这个建议:


image.png


明白为什么这样写了吧?


所以,这小节的答案是这样的吗?肯定不是的,我们再多想一步呢:


为什么要非得把 String 取 hashCode 才进行 switch/case 操作呢?


从 class 文件中我们已经看不出什么有价值的东西了。只能在往下走。


class 再往下走就到哪里了?


对了,需要看看字节码了。


通过 javap 获得字节码文件:


image.png


这个字节码很长,大家自己编译后去看一下,我就不全部截取,浪费篇幅了。


在这个字节码里面,就算你什么都不太明白。但是只要你稍微注意一点点,你应该会注意到其中的这两个地方:


image.png



目录
相关文章
|
5月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
4月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
3月前
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
4月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
131 2
|
6月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
6月前
|
存储 算法 架构师
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
|
8月前
|
存储 SQL 算法
阿里面试:每天新增100w订单,如何的分库分表?这份答案让我当场拿了offer
例如,在一个有 10 个节点的系统中,增加一个新节点,只会影响到该新节点在哈希环上相邻的部分数据,其他大部分数据仍然可以保持在原节点,大大减少了数据迁移的工作量和对系统的影响。狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由”。在 3 - 5 年的中期阶段,随着业务的稳定发展和市场份额的进一步扩大,订单数据的增长速度可能会有所放缓,但仍然会保持在每年 20% - 30% 的水平。
阿里面试:每天新增100w订单,如何的分库分表?这份答案让我当场拿了offer
|
8月前
|
算法 NoSQL 应用服务中间件
阿里面试:10WQPS高并发,怎么限流?这份答案让我当场拿了offer
在 Nacos 的配置管理界面或通过 Nacos 的 API,创建一个名为(与配置文件中 dataId 一致)的配置项,用于存储 Sentinel 的流量控制规则。上述规则表示对名为的资源进行流量控制,QPS 阈值为 10。resource:要保护的资源名称。limitApp:来源应用,default表示所有应用。grade:限流阈值类型,1 表示 QPS 限流,0 表示线程数限流。count:限流阈值。strategy:流控模式,0 为直接模式,1 为关联模式,2 为链路模式。
阿里面试:10WQPS高并发,怎么限流?这份答案让我当场拿了offer