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

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

时间:2023-09-23 18:23:30浏览次数:42  
标签:面试题 字节 ++ 递增 所有人 然后 指令

前言

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

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

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

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

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

起因

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

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

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

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

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

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

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

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

正文

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

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

首先,先看两个小例子:

image

image

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

然后,我们来看看结果。

image

image

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

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

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

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

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

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

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

3、字节码指令

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

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

1)、从字节码看区别

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

image

image

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

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

image

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

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

image

image

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

image

image

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

image

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

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

总结

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

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

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

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


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

标签:面试题,字节,++,递增,所有人,然后,指令
From: https://www.cnblogs.com/fulongyuanjushi/p/17724834.html

相关文章

  • Redis主从复制,高可用性面试题
    参考链接:https://xiaolincoding.com/redis/cluster/master_slave_replication.html#%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%90%8C%E6%AD%A5 主从第一步同步的过程? 分成三步进行:1、建立连接,从服务器获得主服务的id和复制位置,一开始是-1。2、主服务器fork一个子进程用来创建当前的R......
  • 剑指Offer面试题10:斐波那契数列
    一、题目示例:输入:4返回值:3说明:根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。二、题解2.1解法一:迭代相加知识点:动态规划动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然......
  • C++ 公司数量 正解
    题目描述在某个城市里住着n个人,现在给定关于n个人的m条信息(即某2个人认识),假设所有认识(直接或间接认识都算认识)的人一定属于同一个公司。若是某两人不在给出的信息里,那么他们不认识,属于两个不同的公司。已知人的编号从1至 n。请计算该城市最多有多少公司。......
  • 随想录Day4|24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点、面试题 02.07.
    随想录Day4|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表Ⅱ 24.两两交换链表中的节点文章讲解视频讲解给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,......
  • C++11新标准
    c++11标准(1)一、longlong类型新增了类型longlong和unsignedlonglong,以支持64位(或更宽)的整型。在VS中,int和long都是4字节,longlong是8字节。在Linux中,int是4字节,long和longlong是8字节。二、char16_t和char32_t类型新增了类型char16_t和char32_t,以支持16位和32位......
  • vue3的面试题
    1.什么是Vue3?Vue3有哪些新增特性?答:Vue3是Vue.js框架的最新版本,它增加了很多新特性,包括CompositionAPI、Teleport、Suspense和Fragment等。2.Vue3CompositionAPI是什么?它的作用是什么?答:Vue3CompositionAPI是Vue3中的一个新特性,它的作用是将组件中的逻辑分解成可复用的可......
  • 笔记 | C++ 命名空间
    命名空间(Namespace)是C++中用于组织和管理代码的重要机制。它允许开发者将一组相关的变量、函数、类等封装在一个独立的命名空间中,以避免命名冲突和提高代码的可维护性。本文将介绍命名空间的概念、如何应用命名空间,以及它的优点和缺点。命名空间的概念在C++中,命名空间是一个逻......
  • C++指针和地址偏移在HotSpot VM中的应用
     在前面我们介绍过new运算符,这个操作实际上上包含了如下3个步骤:调用operatornew的标准库函数。此函数会分配一块内存空间以便函存储相应类型的实例;调用相应类的构造函数;返回一个指向该对象的指针。在第一步中,其实我们可以自己写个operatornew函数对标准库函数进行重载,通......
  • c++ 数据类型及范围
    short:\(-2^{15}\sim2^{15}-1\)unsignedshort:\(0\sim2^{16}-1\)int:\(-2^{31}\sim2^{31}-1\)unsignedint:\(0\sim2^{32}-1\)longlong:\(-2^{63}\sim2^{63}-1\)unsignedlonglong:\(0\sim2^{64}-1\)参考资料:https://www.cnblogs.com......
  • Linux用g++编译生成动态连接库.so的方法及连接
    Linux动态库默认搜索路径/lib64、/usr/lib64、/lib、/usr/lib系统头文件目录/usr/include常用命令lddmain:查看二进制可执行文件链接的动态链接库信息,例如lddnginxg++-cmain.cpp:以单个xx.cpp源文件为单位只编译出xx.o的二进制文件(称为:目标文件)g++xx.oyy.o-oma......