​美团一面问我i++跟++i的区别是什么

美团一面问我i++跟++i的区别是什么

面试官:“i++跟++i的区别是什么?”

我:“i++是先使用然后再执行+1的操作,++i是先执行+1的操作然后再去使用i”

面试官:“那你看看下面这段代码,运行结果是什么?”

public static void main(String[] args) {
    int j = 0;
    for (int i = 0; i < 10; i++) {
        j = (j++);
    }
    System.out.println(j);
}

我:“我猜他肯定不是10”

面试官:

b1b3a3d3d57c6afcc44b9cd191830e77.jpeg

我:“哈哈.....,开个玩笑,结果为0啦”

f8794a63117c03399e5b262e6942c83f.jpeg

面试官:“为什么呢?”

我:“简单来说的话,j++这个表达式每次返回的都是0,所以最终结果就是0”

对应前文提到过的:i++这种写法是先使用,再执行+1操作,如果不理解请暂停多思考思考

面试官:“小伙子不错,那你能从更底层的角度讲一讲为什么嘛?”

4d47378c14f5a56761699787aae6b154.png

首先我们知道,JVM的运行时数据区域是分为好几块的,具体分布如下图所示:1cb99584fa4b90b453259b26ed8938a6.png现在我们主要关注其中的虚拟机栈,关于虚拟机栈,我们需要了解的是:

  1. Java虚拟机栈是由一个个栈帧组成,线程在执行一个方法时,便会向栈中放入一个栈帧。

  2. 每一个方法所对应的栈帧又包含了以下几个部分

  • 局部变量表

  • 操作数栈

  • .........

其中的局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用。

局部变量表的最小存储单元为Slot(槽),其中64位长度的long和double类型的数据会占用2个Slot,其余的数据类型只占用1个。因此可以直接通过下标来进行数据访问

操作数栈对于数据的存储跟局部变量表是一样的,但是跟局部变量表不同的是,操作数栈对于数据的访问不是通过下标而是通过标准的栈操作来进行的(压入与弹出)

数据的计算是由CPU完成的,弹栈的目的就是将数据压入到CPU中

接下来我们分析下面这段代码在字节码层面的执行过程:

// 为方便阅读将对应代码也放到这里
public static void main(String[] args) {
 int j = 0;
 for (int i = 0; i < 10; i++) {
     j = (j++);
 }
 System.out.println(j);
}

我们进入到这段代码编译好的.class文件目录下执行:javap -c xxx.class,得到其字节码如下:

public static void main(java.lang.String[]);
    Code:
       0: iconst_0    // 将常数0压入到操作数栈顶
       1: istore_1    // 将操作数栈顶元素弹出并压入到局部变量表中1号槽位,也就是j=0
       2: iconst_0    // 将常数0压入到操作数栈顶
       3: istore_2   // 将操作数栈顶元素弹出并压入到局部变量表中2号槽位,也就是i=0
       4: iload_2     // 将2号槽位的元素压入操作数栈顶
       5: bipush        10   // 将常数10压入到操作数栈顶,此时操作数栈中有两个数(常数10,以及i)
       7: if_icmpge     21  // 比较操作数栈中的两个数,如果i>=10,跳转到第21行
      10: iload_1    // 将局部变量表中的1号槽位的元素压入到操作数栈顶,就是将j=0压入操作数栈顶
      11: iinc          1, 1 // 将局部变量表中的1号元素自增1,此时局部变量表中的j=1

      14: istore_1    // 将操作数栈顶的元素(此时栈顶元素为0)弹出并赋值给局部变量表中的1号             槽位(一号槽位本来已经完成自增了,但是又被赋值成了0)
      
      15: iinc          2, 1 // 将局部变量表中的2号槽位的元素自增1,此时局部变量表中的2号元素值为1,也就是i=1
      
      18: goto          4  // 第一次循环结束,跳转到第四行继续循环
      21: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_1
      25: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      28: return

我们着重关注第10,11,14行字节码指令,用图表示如下:

44029247cc876f23d3b46d5d085fc1da.png

可以看到本来局部变量表中的j已经完成了自增(**iinc指令是直接对局部变量进行自增**),但是在进行赋值时是将操作数栈中的数据弹出,但是操作数栈的数据并没有经过计算,所以每次自增的结果都被覆盖了,最终结果就是0。

我们平常说的i++是先使用,然后再自增,而++i是先自增再使用。这个到底怎么理解呢?如果站在JVM的层次来讲的话,应该这样说:

  1. i++是先被操作数栈拿去用了(先执行的load指令),然后再在局部变量表中完成了自增,但是操作数栈中还是自增前的值

  2. 而++1是先在局部变量表中完成了自增(先执行innc指令),然后再被load进了操作数栈,所以操作数栈中保存的是自增后的值

这就是它们的根本区别。

关于i++的执行过程,我这里也给出一个程序及编译后的结果

public static void main(String[] args) {
    int i = 0;
    i = ++i;
    System.out.println(i);
}
>  0 iconst_0
>  1 istore_1
>  2 iinc 1 by 1
>  5 iload_1
>  6 istore_1
>  7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
> 10 iload_1
> 11 invokevirtual #3 <java/io/PrintStream.println : (I)V>
> 14 return

大家可以自行分析

作者简介:

大三选择从大学退学,创业3年失败进入it行业,又从高中学历开始自考,从大专考到本科,主打一个自作自受,人生升级打怪专家。

7年it从业经验,4年基础架构及中间件开发,多个开源社区contributor。

半自由职业者,新时代数字游民。

自媒体创业者,专注分享成长路上的所悟所得。

长期探索 个人成长职业发展自媒体创业副业探索

b14062d07b3c078d03bdaa4cbe503b00.png

### 回答1: 美团外卖在线评论 CSV 是一个用于存储管理美团外卖用户评论信息的文件格式。 CSV 是 Comma-Separated Values(逗号分隔值)的缩写,它是一种简单的纯文本格式,用于将表格数据保存在文本文件中。每一行代表一条评论数据,数据之间使用逗号进行分隔。 美团外卖在线评论 CSV 包含了用户评论的各种信息,例如评论内容、评论时间、用户评分、商家名称等等。通过该文件,商家可以轻松地管理分析用户的评论数据。 美团外卖在线评论 CSV 的使用非常方便。商家可以使用电子表格软件(如 Microsoft Excel 或 Google Sheets)来打开编辑该文件。他们可以根据需要进行筛选、排序、统计分析评论数据,以获取对于商家业务服务质量的反馈认知。 此外,美团外卖在线评论 CSV 也可以与其他系统进行数据集成。商家可以将评论数据导入到自己的数据库系统中,以便更好地结合其他业务数据进行深入分析。 总而言之,美团外卖在线评论 CSV 是一种方便存储管理美团外卖用户评论信息的文件格式。它为商家提供了更好的数据管理分析能力,帮助他们理解用户需求、改进服务,并提升用户体验。 ### 回答2: 美团外卖在线评论 csv 是指用 CSV(逗号分隔值)格式存储的美团外卖平台上用户对餐厅服务菜品质量的在线评论数据。 CSV 是一种常见的文本文件格式,它以逗号作为字段之间的分隔符,每行表示一个记录。美团外卖在线评论 csv 可以包含以下信息:评论ID、评论时间、用户ID、餐厅ID、评分、评论内容等字段。 美团外卖平台通过收集用户的在线评论数据,可以对餐厅的服务质量菜品口碑进行评估改进。通过分析美团外卖在线评论 csv 数据,可以得出以下结论: 1. 用户评分:通过计算评分的平均值标准差,可以评估餐厅的整体服务质量。高分表示用户对餐厅的满意度较高,反之则表示还有待改进。 2. 评论内容:通过对评论内容进行文本分析,可以了解用户对餐厅菜品、包装、送餐速度等方面的态度意见。这些反馈信息可以帮助餐厅改进菜品质量服务流程。 3. 用户属性:可以根据用户ID进行用户分群,评估不同用户群体对餐厅的满意度关注点。例如,一些用户可能更注重送餐速度,而另一些用户则更为关注菜品口味。 4. 外卖热度:可以根据评论的时间戳信息,分析餐厅在不同时段的外卖订单量用户评价情况。这可以帮助美团外卖了解外卖行业的消费趋势高峰时段。 综上所述,美团外卖在线评论 csv 提供了餐厅服务质量用户满意度的重要数据。通过对这些数据的深入分析,可以为餐厅美团外卖平台提供有价值的改进意见规划策略。 ### 回答3: 美团外卖在线评论csv是一个存储美团外卖用户评论信息的文件格式。CSV是Comma-Separated Values的缩写,意为逗号分隔值。该文件格式将每个数据值用逗号分隔,每行表示一个记录,方便数据的存储读取。 在美团外卖中,用户可以在下单后对商家餐品、配送速度、服务等进行评价并留下评论。这些用户评论的信息被美团外卖平台收集整理后,以CSV的格式存储在文件中。 美团外卖在线评论CSV中的数据包含以下内容: 1. 评论ID:每个评论都有唯一的ID,用于标识区分不同的评论。 2. 用户ID:评论的用户ID,用于关联评论用户之间的关系。 3. 商家ID:评论的商家ID,用于关联评论商家之间的关系。 4. 评论内容:用户对餐品、配送速度、服务等方面的评价留言。 5. 评分:用户对美团外卖的整体评分,通常是一个0-5的分数。 6. 时间戳:评论提交的时间戳,用于记录评论的时间。 7. 其他相关数据:可能还包含一些其他相关的数据,例如评论的点赞数、回复数等。 美团外卖在线评论CSV可以通过各种数据处理工具进行读取分析,例如Python中的pandas库等。通过分析评论数据,美团外卖可以了解用户对不同商家配送服务的满意度,为用户推荐更好的商家,并不断改进服务质量。 总之,美团外卖在线评论CSV是一个方便存储分析用户评论数据的文件格式,对于了解用户需求、优化服务具有重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值