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

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

结合着 class 文件看:


image.png


奇怪了,同样的 switch 语言,却对应两个指令:lookupswitch 和 tableswitch。


所以这两个指令肯定是关键突破点。


我们去哪里找这个两个指令的信息呢?


肯定是得找权威资料的:


image.png


怎么样?


The Java® Virtual Machine Specification,Java 虚拟机规范,你就大声的告诉我稳不稳?


https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-3.html#jvms-3.10


image.png


发现这两个指令,在 Compiling Switches 这一小节中是挨在一起的。


找到这里了,你就找到正确答案的门了。我带领大家看一下我通过这个门,看到的门后面的世界。


首先还是给大家带着我自己的理解,翻译一下虚拟机规范里面是怎么介绍这两个指令的:


image.png


switch 语句的编译使用的是 tableswitch 和 lookupswitch 这两个指令。


我们先说说 tableswitch 是干啥的。


当 switch 里面的 case 可以用偏移量进行有效表示的时候,我们就用 tableswitch 指令。如果 switch 语句的表达式计算出来的值不在这个偏移量的有效范围内,那么就进入 default 语句。


看不太明白对不对?


没关系,我第一次看的时候也不太明白。别急,我们看看官方示例:


image.png


因为我们 case 的条件是 0、1、2 这三个挨在一起的数据,挨在一起就是 near 。所以这个方法就叫做 chooseNear 。


而这个 0、1、2 就是三个连在一起的数字,所以我们可以用偏移量直接找到其对应的下一个需要跳转的地址。


这个就有点类似于数组,直接通过索引下标就能定位到数据。而下标,是一串连续的数字。


这个场景下,我们就可以用 tableswitch。


image.png


当 switch 语句里面 case 的值比较“稀疏”(sparse)的时候,用 tableswitch 指令的话空间利用率就会很低下。于是我们就用 lookupswitch 指令来代替 tableswitch。

你注意官网上用的这个词:sparse。


image.png


没想到吧,学技术的时候还能学个英语四级单词。


稀疏。翻译过来了,还是读不懂是不是,没有关系。我给你搞个例子:


image.png


左边是 java 文件,里面的 case 只有 0、2、4。


右边是字节码文件, tableswitch 里面有0、1、2、3、4。


对应的 class 文件是这样的:


image.png


嘿,你说怎么着?莫名其妙多了个 1 和 3 的 case 。你说神奇不神奇?


这是在干嘛?这不就是在填位置嘛。


填位置的目的是什么?不就是为了保证 java 文件里面的 case 对应的值刚好能和偏移量对上吗?


假设这个时候 switch 表达式的值是 2,我直接根据偏移量 2 ,就可以取到 2 对应的接下来需要执行的地方 47,然后接着执行输出语句了:


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