【码农每日一题】Java 自增自减运算符神坑笔试题

《【码农每日一题】Java 自增自减运算符神坑笔试题》
关注一下嘛,又不让你背锅!

《【码农每日一题】Java 自增自减运算符神坑笔试题》

问:下面程序的运行结果是什么?


   
  
  1. int count =0;

  2. for(int i=0; i<100; i++) {

  3.    count = count++;

  4. }

  5. System.out.println("count=" + count);

答:运行结果是 count = 0。

首先 count++ 是一个有返回值的表达式,返回值是 count 自加前的值,Java 对自加处理的流程是先把 count 的值(不是引用)拷贝到一个临时变量区,然后对 count 变量加1,接着返回临时变量区的值。

所以上面代码块中第一次循环的执行步骤是 JVM 把 count 值(0)拷贝到临时变量区,然后 count 值加 1,这时 count 的值是 1,接着返回临时变量区的值(值是 0),最后返回值赋值给 count,此时 count 值被重置成 0;所以上面代码语句 count = count++; 可以按照如下代码来理解:


   
  
  1. int autoAdd(int count) {

  2.    int temp = count;

  3.    count = count + 1;

  4.    return temp;

  5. }

所以第一次循环后 count 的值还是 0,其他 99 次的循环也是一样的,最终导致 count 的值始终没有改变,仍然保持着最初的状态;如果想要打印结果为 100 则需要修改 count = count++; 语句为 count++; 即可。因此对于 ++/– 运算在 java 中一定要警惕这个陷阱(– 运算符也一样存在这个问题),不过这个问题在不同的语言环境中的实现是不同的,在 C++ 中 count = count++; 与 count++ 是等效的,而在 java 等语言中 count = count++; 与 count++ 是不等效的,区别如这道题。

问:Java 或者 Android 开发中可以通过哪些方式来保证并发安全的自增自减操作?

答:java 默认的自增自减运算符是非并发安全的,要想实现并发安全的自增自减操作可以通过如下几种方式实现。

通过 synchronized 代码块或者方法来保证自增自减并发安全。

通过主动使用 Lock 锁来保证自增自减并发安全。

通过 JDK 提供的 AtomicInteger 类来直接保证自增自减并发安全。

上面几种做法中最推荐直接使用 AtomicInteger 的方式,因为其相对于其他几种方式封装性非常便捷,此外其实现基于 volatile 对象的 CAS 操作来保证并发安全,算是一种相对高效的方式。

《【码农每日一题】Java 自增自减运算符神坑笔试题》主人,别嫌短,长了你肯定不会看完的,所以这就是码农每日一题的宗旨~

《【码农每日一题】Java 自增自减运算符神坑笔试题》看完分享一波嘛,和你的小伙伴一起讨论才更加有意思~

看个笑话放松一下

校园里我听见一对情侣在聊天,女的说:“你说我贱不贱!”男的说:“不贱!”女的说:“可是我想贱么。”男的正在犹豫,我上去就给那女的来了一脚,骂道:“从来没见过这么贱的女人。”那女的委屈道:“我就是想借本书,问我男朋友借不借,关你什么事?”然后我就被那男生追了六条街,唉不说了,现在还在跑呢,泪奔中……

I stay up late every night and realize it’s a bad idea every morning!

 

每天早上都觉得自己晚上真不该熬夜!

《【码农每日一题】Java 自增自减运算符神坑笔试题》
《【码农每日一题】Java 自增自减运算符神坑笔试题》
    原文作者:JVM
    原文地址: https://juejin.im/entry/59e2c4036fb9a045263a9df5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞