首页
学习
活动
专区
工具
TVP
发布

java中 i = i++和 j = i++ 的区别

由于i++和i--的使用会导致值的改变,所以在处理后置的++和--的时候,java的编译器会重新为变量分配一块新的内存空间,用来存放原来的值, 而完成赋值运算之后,这块内存会被释放。...(1)对于j = i++的情况 ?   ...i的原始值存放在后开辟的内存中,最后将这个值赋给j,进行j = i++运算之后,j会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到的值分别是:j(此时的值等于初始i的值)和i...(2)对于i = i++的情况 ?...总结:  Java编译器每次遇到自增(指的是i++)、自减(指的是i--)运算符的时候都会开辟一块新的内存空间来保存赋值之前j的值,即为缓存变量,然后再将这个换成变量的值赋给左边的变量。

1.2K100
您找到你想要的搜索结果了吗?
是的
没有找到

java中i++ 和 ++i的区别

今天同事扔给我两道面试题,由于我2年前就接触过这道题,所以没啥意思,我看完后扔到一个交流群里,回答这道题的绝大部分人竟然都答错了;很多人很清晰的知道这两道题想考察面试者对 i++ 和 ++i 的理解...(这是一道典型的看着非常简单的题,但是不少人还是会因为粗心栽跟头) 第一题: int a = 0; for (int i = 0; i < 99; i++) {...System.out.println(a); 先在纸上写出自己的答案,然后看 第二题: int b = 0; for (int i = 0; i < 99; i+...i++ 和 ++i 在理论上的区别是: i++:是先把i拿出来使用,然后再+1; ++i :是先把i+1,然后再拿出来使用; 答案见下: 第一题:a=0 第二题:b=99 再升级一下 第三题...Integer a = 0; int b = 0; for (int i = 0; i < 99; i++) { a = a ++;

1.2K30

面试细节: i = i++和 i = ++i

public class test01 { public static void main(String[] args) { int i = 1; i = i+...+; int j = i++; int k = i + ++i * i++; System.out.println("i="+i); System.out.println...此题目我们只需要用到栈帧里面的局部变量表和操作数栈 2.1、第一步 int i = 1 [07fb0f1c-2013-4ca1-9de3-63693a07aa4f.png] 只是一个简单的赋值操作 2.2、第二步 i = i+...] `结果:i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1 ` 2.4、第四步 int k = i + ++i * i++ [6798b125...// 结果:i = 2 } } `最后的最后:本文的思考过程和计算推导仅针对Java语言 ` 微信搜索:【Java小咖秀】更多精彩等着您~ 回复手册获取博主15万字Java面试通关手册&2万字Linux

1.8K00

i++需要多少QPS才能测出BUG

关于 Java 的一些线程安全的问题,可以参考旧文: 操作的原子性与线程安全 2019-07-16 快看,i++真的不安全 2019-07-19 原子操作组合与线程安全 2019-07-22 线程安全集合类中的对象是安全的么...Lambda表达式在线程安全Map中应用 2020-06-01 下面我们来聊聊上面提到的问题,因为这涉及到不同类型的 BUG 需要多少 QPS 才能测出来 BUG,今天来分享一下最简单的线程不安全操作i+...用例设计思路 首先,我使用的同一个 JVM 来测试i++,发现极容易出现 BUG,后来放弃了这种方式。...经过思考发现如果放在一个 JVM 里面,本身已经创建了很多线程去执行i++,这种跟实际接口测试差异比我想象的大很多。其次,我创建了一个简单的 Springboot 项目,写一个简单的接口来实现。...public Result test1() { Thread.sleep(SourceCode.getRandomInt(20)); return Result.success(i+

42520

从volatile说到i++的线程安全问题

=>42,当然使用volatile的同时也会增加性能开销 注意 volatile并不能保证非源自性操作的多线程安全问题得到解决,volatile解决的是多线程间共享变量的「可见性」问题,而例如多线程的i+...+,++i,依然还是会存在多线程问题,它是无法解决了.如下:使用一个线程i++,另一个i--,最终得到的结果不为0 public class VolatileTest { private static...// new DecThread().run(); System.out.println("Start thread: " + Thread.currentThread() + " i+...+和++i并非原子操作,我们若查看字节码,会发现 void f1() { i++; } 的字节码如下 void f1(); Code: 0: aload_0 1: dup 2: getfield #2...; //Field i:I 5: iconst_1 6: iadd 7: putfield #2; //Field i:I 10: return 可见i++执行了多部操作, 从变量i中读取读取i的值

40020

短文:用字节码解析i++和++i的区别

记得刚工作的时候被问i++是不是原子操作。初出茅庐答不上来,对java并发不了解。以此笔记缅怀自己的年轻。...看下面的代码 public class Test { public static void main(String[] args) { int i = 8; i = i+...是不是很无聊,相信很多人会回答,i++是先赋值再+1,++i是先+1再赋值。确实是这样,但是我总是想追根溯源,如何解释这个原则? 打开IDEA,下载一个jclasslib插件。 ?...右边就是显示这个类的class字节码信息,字节码其实是一堆二进制数据,当然,这些二进制数据按一定的规则存放,这个插件就是简单根据规则翻译了这个class文件,我们先看i=i++。...从表面上看就是上文说的,i=i++先赋值再加1,i=++i先加1再赋值。 曾经的那个面试官,你在哪儿,我来回答你当年那个问题,可能你并不知道也停留在表面吧。

75820
领券