一个关于 i++ 和 ++i 的面试题打趴了所有人
前言
都说大城市现在不好找工作,可小城市却也不好招人。
我们公司招了挺久都没招到,主管感到有些心累。
我提了点建议,是不是面试问的太深了,在这种小城市,能干活就行。
他说自己问的面试题都很浅显,如果答不上来说明基础太弱了。
我问了下面试题,然后我沉默了。
起因
起因就是我嘴欠问了下这个面试题:
i++ 和 ++i 有什么区别,谁的效率更高?并解释出原因。
没错,我竟然答不上来,贼尴尬,心想早知不问了。
主管有些意外,又问了几个别的同事,没一个答上来的。
他脸黑了,周四研发部例会的时候,干脆所有人问了一遍。
好吧,都是工作至少5年以上的Java程序员,没一个人答上来,五花八门的回答,全错。
然后大家就一致决定(主管决定),每周展开一次学习会,要补基础,保持团队学习热情,提升团队技术能力。
本来是为了招人,结果自己人被团灭。
正文
我挤出一个晚上不带娃的时间到处找资料,研究了下这个面试题,在此分享给大家,希望能有帮助。
1、i++ 和 ++i 有什么区别
首先,先看两个小例子:


到这里先停一下,大家自己思考半分钟,觉得打印结果是什么。
然后,我们来看看结果。


没错,第一个打印是 6 和 5,第二个打印是 6 和 6。
这就是他们的区别,解释下原因:
i++:这是后缀递增运算符,先将当前值赋给变量,然后再递增。
++i:这是前缀递增运算符,先递增变量的值,然后再赋给变量。
2、i++ 和 ++i 谁的效率高
这个问题我其实蒙对了,我说是一样高的,但是主管问我原因,我没答上来。
后来告诉我了答案,就是它们被JVM优化后的字节码是相同的,所以效率一样高。
3、字节码指令
然后我就去找了字节码指令的用法,将上面的案例以及两者效率是否一样进行了验证。
指令用法很简单,定位到class文件所在目录,使用
javap -verbose命令执行即可。
1)、从字节码看区别
我们将前面那个案例,通过字节码指令输出到txt文件中。


在文档编辑器中找到main方法,对这两个字节码内容进行比对,发现确实有如下不同。
可以看到红框部分,刚好佐证了上面解释的区别,i++会先使用当前值,然后再递增;而++i会在递增之后立即使用新值,通过字节码看起来还是挺明显的。

2)、从字节码看谁的效率高
我们依然写个for循环的小例子来做验证。


将这两个类编译后的class通过字节码指令输出到txt中


接下来我们就可以比对下结果了

可以看到,main方法开始,从上到下的字节码是完全一样的,没任何不同。
所以,i++ 和 ++i 的效率本质是一样高的。
总结
其实,我相信很多人都见过这个面试题,甚至在笔试题当中也遇到过。
但工作了这么多年,即使是我,也只是剩下一点印象,也没有真正去研究一下这个简单的问题。
希望这篇文章,给大家有所帮助,也能启发大家如何去研究此类问题。
好了,今天的小知识你学会了吗?
如果喜欢,请点赞+关注↓↓↓,持续分享干货哦!
一个关于 i++ 和 ++i 的面试题打趴了所有人的更多相关文章
- 《招聘一个靠谱的iOS》面试题参考答案(下)
相关文章: <招聘一个靠谱的iOS>面试题参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外 ...
- java13-5 JDK1.5以后的一个新特性和Integer的面试题
1.JDK5的新特性 自动装箱:把基本类型转换为包装类类型 自动拆箱:把包装类类型转换为基本类型 注意一个小问题: 在使用时,Integer x = null;代码就会出现NullPointerExc ...
- 招聘一个靠谱的iOS》面试题参考答案(上)
说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 博文中给出了高质量的面试题,但是未给出答案, ...
- 《招聘一个靠谱的iOS》面试题参考答案(上)
说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 博文中给出了高质量的面试题,但是未给出答案, ...
- 一个关于finally和return的面试题
public class Test{ public int add(int a,int b){ try { return a+b; } catch (Exception e) { System.out ...
- 一个区分度很大的iOS面试题
@property 后面可以有哪些修饰符?@property中有哪些属性关键字? 属性可以拥有的特质分为四类: 原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确 ...
- 一个面试题的解答-----从500(Id不连续)道试题库里随机抽取20道题!
做一个考试系统的项目,现在从试题库里面随机抽取20道题 比如我题库有500道题(ID不连续).题目出现了,如何解决呢,随机抽取! 1,我们先把500道题的id存进一个长度为500的数组. 2,实现代码 ...
- 【web前端面试题整理08】说说最近几次面试(水)
为什么换工作 换工作简单来讲一般会归纳为钱不够或者人不对,我们团队氛围很不错,所以基本就定位到钱不够了,而我更多是考虑到以后的职业发展,简单说来就是对以后几年的工作有想法,而这种想法实现不一定能在现在 ...
- C/C++ 笔试题
/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...
- Android面试题整理【转载】
面试宝典(5) http://www.apkbus.com/android-115989-1-1.html 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad ...
随机推荐
- CANoe _ Panel面板的创建过程
在Canoe中创建Panel面板,用于显示和操作CAN网络的数据和信号,遵循以下步骤: 1.打开Canoe 启动Canoe软件. 2.打开项目 在Canoe的菜单栏中,选择"File&quo ...
- 玉 - Sliver
基操 1.启动服务端 ./sliver-server_linux 2.启用多客户端协同 new-operator --name zha0gongz1 --lhost [serverip] #生成客户端 ...
- ArcPy批量对大量遥感影像相减做差
本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件批量进行相减做差的方法. 首先,我们来明确一下本文的具体需求.现有一个存储有多张.tif格式遥感影像的文件夹,其中每一个遥感影像 ...
- Linux下Redis集群部署
一.Redis集群介绍 Redis 集群是一个提供在多个Redis节点间共享数据的程序集.Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性 ...
- PostgreSQL 12 文档: PostgreSQL 服务端程序
PostgreSQL 服务器应用 这一部分包含PostgreSQL服务器应用和支持工具的参考信息.这些命令只在数据库服务器所在的主机上运行才有用.其他工具程序在PostgreSQL 客户端应用中列 ...
- EaselJS 源码分析系列--第二篇
在 第一篇 中我们大致分析了从: 创建舞台 -> 添加显示对象-> 更新显示对象 的源码实现 这一篇将主要分析几个常用显示对象自各 draw 方法的实现 让我们看向例子 examples/ ...
- ChatGPT的探索与实践-业务应用篇
本篇文章主要介绍在实际的开发过程当中,如何使用GPT帮助开发,优化流程,恰逢今年京东20周年庆,文末会介绍如何与618大促实际的业务相结合,来提升应用价值.全是干货,且本文所有代码和脚本都是利用GPT ...
- Elementary OS old version download 旧版本下载
Elementary OS 号称是最漂亮的Linux发行版,没有之一.确实,他的整体风格看起来就是特别舒服,说不出哪里特别好,但也挑不出什么毛病.相比之下,其他Linux的界面总感觉不太和谐.比如特别 ...
- 五分钟教你使用GitHub寻找优质项目
前言 经常会有同学会问如何使用GitHub找到自己想要的项目,今天咱们就出一期快速入门教程五分钟教你使用GitHub寻找优质项目.GitHub作为世界上最大的项目开源平台之一,上面有着无数优质的开源项 ...
- TCP 链接关闭 -- 客户端为什么需要60秒的time_wait状态
客户端主动关闭连接时( FIN-> ACK<- FIN<- ACK->),在发送最后一个ack后会进入TIME_WAIT状态,停留2个MSL时间,进入CLOSED状态 MSL就 ...