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

news2024/11/19 17:34:53

前言

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

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

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

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

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

起因

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

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 的效率本质是一样高的。

总结

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

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

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Learn Prompt- Midjourney 图片生成:基本设置和预设

/settings指令为模型版本、样式值、质量值和升级器版本等常用选项提供切换按钮。 备注 添加到提示末尾的参数将覆盖/settings中的设置。 模型版本​ 1️⃣ MJ Version 12️⃣ MJ Version 23️⃣ MJ Version 34️⃣ MJ Version 45️⃣ MJ Version 5🌈 Niji Mode&a…

虚拟机如何连接MobaXterm

MobaXterm是一款增强型远程连接工具,Xshell相似。可以与虚拟机连接,从而在Windows界面下对其进行相关操作,使用非常的便捷 1.下载vmware并且在上面安装虚拟机任意版本。这里我安装的是centos7(2009) 2.打开终端 输入命…

TIM定时器

简介 • TIM ( Timer )定时器 • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 • 16 位计数器、预分频器、自动重装寄存器的时基单元,在 72MHz 计数时钟下可以实现最大 59.65s 的定时 • 不仅具备基本的定时中…

R语言贝叶斯非参数模型:密度估计、非参数化随机效应META分析心肌梗死数据...

全文链接:http://tecdat.cn/?p23785 最近,我们使用贝叶斯非参数(BNP)混合模型进行马尔科夫链蒙特卡洛(MCMC)推断(点击文末“阅读原文”获取完整代码数据)。 概述 相关视频 在这篇文…

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化...

全文链接:https://tecdat.cn/?p33760 众所周知,心脏疾病是目前全球最主要的死因。开发一个能够预测患者心脏疾病存在的计算系统将显著降低死亡率并大幅降低医疗保健成本。机器学习在全球许多领域中被广泛应用,尤其在医疗行业中越来越受欢迎。机器学习可…

若依前后端分离如何解决匿名注解启动报错?

SpringBoot2.6.0默认是ant_path_matcher解析方式,但是2.6.0之后默认是path_pattern_parser解析方式。 所以导致读取注解类方法需要对应的调整,当前若依项目默认版本是2.5.x,如果使用大于2.6.x,需要将info.getPatternsCondition().getPatterns()修改为info.getPathPatterns…

保研CS/软件工程/通信专业问题汇总(搜集和自己遇到的)

机器学习 1.TP、TN、FP、FN、F1 2.机器学习和深度学习的区别和联系 模型复杂性:深度学习是机器学习的一个子领域,其主要区别在于使用深层的神经网络模型。深度学习模型通常包含多个隐层,可以学习更加复杂的特征表示,因此在某些任…

使用python处理MNIST数据集

文章目录 一. MNIST数据集1.1 什么是MNIST数据集1.2MNIST数据集文件格式1.3使用python访问MNIST数据集文件内容 附录程序源码 一. MNIST数据集 1.1 什么是MNIST数据集 MNIST数据集是入门机器学习/识别模式的最经典数据集之一。最早于1998年Yan Lecun在论文:[Gradient-based l…

Qt5开发及实例V2.0-第十九章-Qt.QML编程基础

Qt5开发及实例V2.0-第十九章-Qt.QML编程基础 第19章 QML编程基础19.1 QML概述19.1.1 第一个QML程序19.1.2 QML文档构成19.1.3 QML基本语法 19.2 QML可视元素19.2.1 Rectangle(矩形)元素19.2.2 Image(图像)元素19.2.3 Text&#xf…

JavaScript中的代理对象(proxy)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建代理对象⭐ 使用代理对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友…

Helm 的简单使用 wordpress install

概述 尝试使用Helm部署wordpress博客服务 Helm | Helm Helm命令 bash自动补全 Helm | Helm补全 - bash wordpress案例 install helm repo add bitnami https://charts.bitnami.com/bitnamihelm install wordpress bitnami/wordpress \ --namespacewordpress \ --create-…

缓存(cache)与缓冲区(buffer)的主要区别

缓存(cache)与缓冲区(buffer)的主要区别 1.Buffer的核心作用是用来缓冲,缓和冲击(对输出设备的冲击,包括磁盘、打印机、显示器)。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大…

SAP PO运维(三):XML消息监控

登录到SAP ECC系统,输入事务码:SXI_MONI,点击“Technical Monitor for Processed XML Messages”,或直接输入事务码SXI_MONITOR: 2、在XML消息处理页面输入查询条件,查看接口XML报错消息: 3、检…

Spring Cloud Alibaba Sentinel流量防卫兵

文章目录 Spring Cloud Alibaba Sentinel流量防卫兵1. 分布式遇到的问题2.解决的方法 Sentinel: 分布式系统的流量防卫兵1. 简介和特折 Sentinel流量防卫兵的搭建1.引入依赖2.添加配置类3.运行类上添加SentinelResource,并配置blockHandler和fallback4. linux中放入…

手摸手图解 CodeWhisperer 的安装使用

CodeWhisperer 是亚⻢逊出品的一款基于机器学习的通用代码生成器,可实时提供代码建议。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点…

KNN-K近邻算法(K-Nearest Neighbors)

k近邻算法的特点 思想极度简单应用数学知识少(近乎为零)效果好(缺点?)可以解释机器学习算法使用过程中的很多细节问题更完整的刻画机器学习应用的流程 k近邻算法 k近邻算法整体是这样的一个算法,我们已经知道的这些数据点其实是…

服务注册发现_Eureka概述

Spring Cloud Eureka 是Netflix 开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力。 Eureka3个角色 服务中心服务提供者服务消费者。 注意: Eureka Server:服务器端。它提…

【Linux】系统编程线程读写者模式(C++)

目录 一、读写锁 二、读写锁接口 【2.1】设置读写优先 【2.2】初始化 【2.3】销毁 【2.4】加读锁 【2.5】加写锁 【2.6】解锁 三、读写锁实例 一、读写锁 在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相…

接口自动化测试之Mock

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 1.Mock实现原理和实现机制 在某些时候,后端在开发接口的时候,处理逻辑非常复杂&a…

基于Java+SpringBoot+Vue+Uniapp奶茶在线下单小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序端的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍:✌…