热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

问:下面程序的运行结果是什么?int count =0;for(int i=0; i

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


  1. int count =0;

  2. for(int i&#61;0; i<100; i&#43;&#43;) {

  3.    count &#61; count&#43;&#43;;

  4. }

  5. System.out.println("count&#61;" &#43; count);


答&#xff1a;运行结果是 count &#61; 0。


首先 count&#43;&#43; 是一个有返回值的表达式&#xff0c;返回值是 count 自加前的值&#xff0c;Java 对自加处理的流程是先把 count 的值&#xff08;不是引用&#xff09;拷贝到一个临时变量区&#xff0c;然后对 count 变量加1&#xff0c;接着返回临时变量区的值。


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


  1. int autoAdd(int count) {

  2.    int temp &#61; count;

  3.    count &#61; count &#43; 1;

  4.    return temp;

  5. }

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



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


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


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


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


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


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


推荐阅读
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 学习笔记17:Opencv处理调整图片亮度和对比度
    一、理论基础在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式:在图像像素中其中:参数f(x)表示源图像像素。参数g(x)表示输出图像像素。 ... [详细]
author-avatar
于浮浅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有