首页 > 其他分享 >一个关于 i++ 和 ++i 的面试题打趴了所有人

一个关于 i++ 和 ++i 的面试题打趴了所有人

时间:2023-11-15 14:32:11浏览次数:31  
标签:面试题 字节 ++ 递增 所有人 指令 上来


一个关于 i++ 和 ++i 的面试题打趴了所有人_运算符

我嘴欠问了下这个面试题:i++ 和 ++i 有什么区别,谁的效率更高?并解释出原因。没错,我竟然答不上来,贼尴尬,心想早知不问了。主管有些意外,又问了几个别的同事,没一个答上来的。他脸黑了……

前言

都说大城市现在不好找工作,可小城市却也不好招人。

我们公司招了挺久都没招到,主管感到有些心累。

我提了点建议,是不是面试问的太深了,在这种小城市,能干活就行。

他说自己问的面试题都很浅显,如果答不上来说明基础太弱了。

我问了下面试题,然后我沉默了。

起因

起因就是我嘴欠问了下这个面试题:

i++ 和 ++i 有什么区别,谁的效率更高?并解释出原因。

没错,我竟然答不上来,贼尴尬,心想早知不问了。

主管有些意外,又问了几个别的同事,没一个答上来的。

他脸黑了,周四研发部例会的时候,干脆所有人问了一遍。

好吧,都是工作至少5年以上的Java程序员,没一个人答上来,五花八门的回答,全错。

然后大家就一致决定(主管决定),每周展开一次学习会,要补基础,保持团队学习热情,提升团队技术能力。

本来是为了招人,结果自己人被团灭。

正文

我挤出一个晚上不带娃的时间到处找资料,研究了下这个面试题,在此分享给大家,希望能有帮助。

1、i++ 和 ++i 有什么区别

首先,先看两个小例子:

一个关于 i++ 和 ++i 的面试题打趴了所有人_i++_02

一个关于 i++ 和 ++i 的面试题打趴了所有人_i++_03

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

然后,我们来看看结果。

一个关于 i++ 和 ++i 的面试题打趴了所有人_字节码_04

一个关于 i++ 和 ++i 的面试题打趴了所有人_运算符_05

没错,第一个打印是 6 和 5,第二个打印是 6 和 6。

这就是他们的区别,解释下原因:

i++:这是后缀递增运算符,先将当前值赋给变量,然后再递增。

++i:这是前缀递增运算符,先递增变量的值,然后再赋给变量。

2、i++ 和 ++i 谁的效率高

这个问题我其实蒙对了,我说是一样高的,但是主管问我原因,我没答上来。

后来告诉我了答案,就是它们被编译器和JVM优化后的字节码是相同的,所以效率一样高。

3、字节码指令

然后我就去找了字节码指令的用法,将上面的案例以及两者效率是否一样进行了验证。

指令用法很简单,定位到class文件所在目录,使用 javap -verbose 命令执行即可。

1)、从字节码看区别

我们将前面那个案例,通过字节码指令输出到txt文件中。

一个关于 i++ 和 ++i 的面试题打趴了所有人_运算符_06

一个关于 i++ 和 ++i 的面试题打趴了所有人_运算符_07

在文档编辑器中找到main方法,对这两个字节码内容进行比对,发现确实有如下不同。

可以看到红框部分,刚好佐证了上面解释的区别,i++会先使用当前值,然后再递增;而++i会在递增之后立即使用新值,通过字节码看起来还是挺明显的。

一个关于 i++ 和 ++i 的面试题打趴了所有人_字节码_08

2)、从字节码看谁的效率高

我们依然写个for循环的小例子来做验证。

一个关于 i++ 和 ++i 的面试题打趴了所有人_i++_09

一个关于 i++ 和 ++i 的面试题打趴了所有人_运算符_10

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

一个关于 i++ 和 ++i 的面试题打趴了所有人_i++_11

一个关于 i++ 和 ++i 的面试题打趴了所有人_i++_12

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

一个关于 i++ 和 ++i 的面试题打趴了所有人_运算符_13

可以看到,main方法开始,从上到下的字节码是完全一样的,没任何不同。

所以,i++ 和 ++i 的效率本质是一样高的。

总结

其实,我相信很多人都见过这个面试题,甚至在笔试题当中也遇到过。

但工作了这么多年,即使是我,也只是剩下一点印象,也没有真正去研究一下这个简单的问题。

希望这篇文章,给大家有所帮助,也能启发大家如何去研究此类问题。

好了,今天的小知识你学会了吗?


如果喜欢,请点赞+关注↓↓↓,持续分享干货哦!

标签:面试题,字节,++,递增,所有人,指令,上来
From: https://blog.51cto.com/u_15780184/8390838

相关文章

  • c++全局变量extern
    externextern是C++中的一个关键字,用于声明一个变量或函数是在其他文件中定义的。它的作用是告诉编译器在链接时在其他文件中寻找该变量或函数的定义。在C++中,如果一个变量或函数在多个文件中使用,那么就需要在每个文件中都声明一次该变量或函数。这时就可以使用extern关键字......
  • Android并发编程高级面试题汇总(含详细解析 四)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • C++ 程序数据传输到动态库后,出现乱码
    程序结构体和动态库结构体如下structVehInfo{ intID; intlaneId; VEHSTATEvehstate; intleftX; intrightX; intleftXSignal;//单车道的左位置 intrightXSignal;//单车道的右位置 intvehLen; intvehWidth; intvehHeight; /*****************************......
  • 常见面试题-Spring的aop和ioc如何实现?
    Spring的aop和ioc怎么实现?Spring的IOC是如何实现的呢?Spring的IOC是通过工厂+反射去实现的,在IOC中,Spring会将创建的Bean都放在工厂中,我们可以通过@Configuration来定义配置类,在配置类中通过@Bean来将Bean创建在Bean工厂中,在对Bean进行实例化时,使用的......
  • C++ 中 <iterator> <functional> <numeric> 库好用的函数
    C++中<iterator><functional><numeric>库好用的函数泰裤辣!<iterator>简述:迭代器省代码用的。std::advance记忆方法:advance-前进。形如:advance(it,step),表示it迭代器自增step步。实现类似于:functionadvance(&it,n): whilen>0: --n ++it whilen<0:......
  • 【每日例题】蓝桥杯 c++ 被替换的身份证
    被替换的身份证题目蓝桥杯被替换的身份证思路分析斗地主简化版?!废话少说,四种情况ShallowDream一开始出对子或者王炸,ShallowDream胜ShallowDream一开始出单,Joker出王炸,Joker胜ShallowDream一开始出单,Joker手中最大的牌比ShallowDream手中的牌都大,Joker胜ShallowDream一开......
  • Java多线程面试题
    目录0、请你说说线程和进程的区别1、请你说说多线程2、说说CAS的ABA问题3、说说你对AQS(抽象队列同步器)的理解4、Java哪些地方使用了CAS5、说说怎么保证线程安全5、说说你了解的线程同步方式6、说说synchronized的用法及原理7、synchronized和Lock有什么区别8、说说Java......
  • Linux下C/C++配置与调试
    环境:Ubuntu18.04.6一.GCC简介:GCC是Linux下的编译工具集,是GNUCompilerCollection的缩写,包含gcc、g++等编译器,该工具及不仅包含编译器,还包含其他工具集,例如ar、num等。GCC工具集不仅能编译C/C++语言,其它例如Objective-C、Pascal、FOrtan、Java、Ada等语言均能进行编译。GC......
  • C++U4-04-递推2
    上节课作业部分(点击跳转) 排列组合排列 组合:  练习题目 题2 编程题1,用递推求组合数编程题3:[【递推】直线分割平面问题]【算法分析】用a[i]表示i条直线最多能将这个圆分割成的部分数:当i=1时,a[1]=2;当i=2时,a[2]=4;......
  • Android并发编程高级面试题汇总(含详细解析 三)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......