《面试宝典》一 自增变量、栈图表分析及字节码分析

前言

社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。知识改变命运,学习成就未来。爱拼才会赢!
程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:
https://github.com/ITfqyd/cxyxs

社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间越长,越发感觉自己技术越菜,有同感的社友,可以在下方留言。现侧重于java底层学习和算法结构学习,希望自己能改变这种现状。
为什么大厂面试,更侧重于java原理底层的提问,因为通过底层的提问,他能看出一个人的学习能力,看看这个人的可培养潜力。随着springboot的流行,大部分的开发,起步就是springboot。也不看看springboot为什么简单?他底层是如果实现的。为什么同样出来4年,工资差别都很大?这些问题都值得我们深思(对社长自己说的)。
api工程师,顶天了,最多达到某些公司中级工资上限,很难突破高级这道坎。希望我们大家成就更好的自己。回想起往事,不会后悔。

每日一面

面试官隔壁小王:自我介绍一下
社长:面试官,您好!我叫社长….
面试官隔壁小王:我这里有一道题目,给你10秒的时候,你给我计算结果。

package com.fyqd.test;

/**
 * Description:
 * Author: 程序猿学社
 * Date:  2020/1/11 0:48
 * Modified By:
 */
public class VarTest {
    public static void main(String[] args) {
        int a =1;     //1
        a = a++;      //2
        int b = a++;  //3
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

社长:心想,那还不简单,太简单了,对我来说,简直就是小case,++在后面,是后赋值,按这样推算,结果a=1 b=1
面试官隔壁小王:答案是错的。你之前从事的工作都是一些搬运工作把,例如CRUD。看你对栈没有什么理解。你回去等通知把!
社长:内心受到1w点暴击。

大家可以想想,答案a和b对应的值分别为多少?

20年后,社长神功达到入门境界,开始出关。

 

1:通过图了解代码流程

有社友反馈,社长漏了一些细节方面,现补上程序运行结果

代码步骤1:
int a =1;

 


a=1,把1赋值给a,并压入栈中
代码步骤2:
a = a++;

 


a++,局部变量的值,有1变成2。
a= 实际上就是把栈里面的结果变为1

 

步骤3:
int b = a++;

 


首先a是为1,先压入栈,栈内的数据为1

 


执行a++,局部变量的a由1变为2。而b=a++,左边部分,就是一个把栈的数据复制给b,所以最终的结果,a为2,b为1。

 

2.字节码

要运行一段Java源码,必须先将源码转换为class文件,class文件就是编译器编译之后供虚拟机解释执行的二进制字节码文件。

2.1 二级制字节码文件如何查看?

不配置打开class文件会乱码

打开class文件,这里用到的是Notepad++,需要安装一个HEX-Editor插件

 


为了,让大家了解class是如何解析的,提高大家的兴趣,我看来看看第一行的二进制字节码。

 


Ca fe ba be标识class文件
00 00 00 34 前两个字节标识副版本号,后两个版本标识主版本号。
0x0000 对应的是0
0x0034 对应的值是52

 


说明使用的jdk是1.8.0的
关于class二级制文件如何解析的,我还有很多要学的,有兴趣的社友可以多了解一下,这里也就简单描述一下,让我们了解一下jvm是如何解析字节码的。

 

如果查看jvm字节码?

可以通过jvm自带的javap.exe来查看,具体配置方法百度IDEA配置查看JVM字节码

 


详细可查JVM 虚拟机字节码指令表
注意:在字节码中常量索引是从1开始的。
字节码文件,第0行:将int型常量值1推送至栈顶
第1行 将栈顶int型数值存入第二个本地变量
第2行 将第二个int型本地变量推送至栈顶
第3行 将指定int型变量增加指定值(增加1)
第6行 将栈顶int型数值存入第二个本地变量
第7行 将第二个int型本地变量推送至栈顶
第8行 将指定int型变量增加指定值(增加1)
第11行 将栈顶int型数值存入第三个本地变量

 

后记

程序猿学社的GitHub,欢迎Star:
https://github.com/ITfqyd/cxyxs
觉得有用,可以点赞,关注,评论,留言四连发。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值