举一个简单的例子,我们希望给一个长字符串出现的每个字符的数量进行打表

这里给出部分代码

String p;
HashMap<Character,Integer> map =new HashMap<>();//使用hashmap存键值对
for(int i =0;i<stringLong;i++){
int count =map.getOrDefault(p.charAt(i),0);//map中有值取值,没值默认为0
map.put(p.charAt(i),count++);
}

我们来看看结果:

//假设这个p是“abcdabcd”
//运行后你会发现map中的值为{‘a’:0,'b':0,'c':0,'d':0}

为什么字符数量都为零呢?因为在Java中,count++是后置递增操作符在执行中导致在count值为0时存入map


在 Java 中,i++(后置递增)和 ++i(前置递增)是自增运算符的两种形式,它们的核心区别在于操作顺序返回值

  • i++:先返回变量的当前值,再执行自增操作。

    示例:

    int i = 5;
    int a = i++; // a=5,之后i=6

    此时 i++ 将原值用于表达式,后自增

  • ++i:先执行自增操作,再返回新值。

    示例:

    int i = 5;
    int b = ++i; // i先变为6,之后b=6

    ++i 立即更新变量值,再参与运算

表达式中的优先级

  • i++的优先级高于++i

    特别需注意与其他运算符结合时的行为:

    int i = 3;
    System.out.println(i++ * 2); // 输出6(3 * 2)
    int j = 3;
    System.out.println(++j * 2); // 输出8(4 * 2)

性能细微差异

for (int i = 0; i < 10; i++);    // 与 ++i 等效

循环中实际编译后生成的字节码甚至可能完全一致。

但是对于一个对象Object obj:

  • obj++:需要生成临时对象保存原值,可能产生额外开销(如拷贝构造函数调用)。
  • ++obj:直接修改对象,无需临时对象,效率更高。

    因此建议在处理迭代器或自定义类时优先使用 ++obj。这也是为什么Leetcode答案中循环代码喜欢用++i

注意事项

  1. 同一表达式中多次自增可能导致不同结果:

    int i = 0;
    int x = i++ + ++i; // 不同编译器可能结果不同,而且难以阅读

    应避免此类写法。

  2. 运算符优先级陷阱

    i++的优先级高于大部分运算符,可能导致逻辑错误:

    int j = 5;
    int k = j++ * 2; // k=10,j=6(而非 5 * 2=10)容易犯错,还是老老实实写j+1吧



总结一句话:i在前面是原值,i在后面先计算

特性 i++ ++i
返回值 原值 新值
适用场景 需保留旧值的计算 需直接使用新值的操作
性能建议 基本类型无差异,对象类慎用 对象类优先使用

从实际的编程示例中看i++与++i的区别的更多相关文章

  1. Muduo 网络编程示例之零:前言

    陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/ ...

  2. Qt 5入门指南之Qt Quick编程示例

    编程示例 使用Qt创建应用程序是十分简单的.考虑到你的使用习惯,我们编写了两套教程来实现两个相似的应用程序,但是使用了 不同的方法.在开始之前,请确保你已经下载了QtSDK的商业版本或者开源版本,并且 ...

  3. 多线程异步编程示例和实践-Thread和ThreadPool

    说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...

  4. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

  5. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

  6. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  7. Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. [Python]Excel编程示例教程(openpyxl)

    1 前言(Preface) 博文背景:论文实验中有一大堆数据集需要观测其数据特征,通过人体肉眼,难以直观感受,故而准备通过生成Excel,可视化其评测数据. We know: Excel便于可视化分析 ...

  9. Python的组合模式与责任链模式编程示例

    Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...

  10. Java8---函数式编程-示例

    // Java8函数式编程示例—(Predicate.Stream.Optional) https://blog.csdn.net/weixin_41950473/article/details/84 ...

随机推荐

  1. 基于RAG的MaxKB知识库问答系统如何选择向量模型

    在MaxKB中替换向量模型前,我们需要先了解向量相关的原理和技术,此处不做赘述,大家可以自行学习.可以了解下Embedding.Embedding核心,向量库等内容. 一.MaxKB 默认向量模型 M ...

  2. NCS开发学习笔记-基础篇-前言

    nRF5 SDK 与 nRF Connect SDK 目前Nordic有2套并存的SDK:老的nRF5 SDK和新的nRF Connect SDK(简称NCS),两套SDK相互独立. nRF5 SDK ...

  3. Java 浮点型去除后面多余的零

    当我们输出的小数不知道有几位小数,也不知道后面有没有带零,去掉后面多余零可以采用以下方法.在实际使用中,多用于小数转百分数,百分数前面的小数乘以100后转String输出,输出的String很多带零, ...

  4. 复杂任务分解:Tree of Thought

    像搭乐高一样玩转AI思考 今天要带大家解锁一个让AI从"单细胞生物"进化成"八爪鱼思考者"的神技--Tree of Thought(思维树).准备好了吗?我们要 ...

  5. 使用react-native-drawer,跟着官网配置仍报错,Error: [Reanimated] `valueUnpacker` is not a worklet, js engine: hermes

    在使用react-native-drawer组件时,编译项目报错 试了许多的方法,最后通过在一篇博客中找到解决方法https://blog.csdn.net/lxyoucan/article/deta ...

  6. CAD通过XCLIP命令插入DWG参照裁剪图形,引用局部图像效果(CAD裁剪任意区域)

    CAD通过XCLIP命令插入DWG参照裁剪图形,实现引用局部图像效果,裁剪任意区域! 1.首先在你要引用局部图的文件内,插入参照! 2. 然后再空白区域指定插入点,输入比例因子,默认输入1,然后缩小视 ...

  7. 朱朝兵《Web前端开发之HTML5+CSS3快速入门》课程资料在线学习

    <Web前端开发之HTML5+CSS3快速入门> [课程简介]本课程由一直专注前端技术与Discuz模板设计与制作!DZ起点网创始人朱朝兵出品,通过本课程学习,即可掌握html5的基本结构 ...

  8. [python] 使用Python实现Markdown文档格式转换

    本文主要介绍如何利用Python中的MarkItDown库将多种文件高效转换为Markdown文本,以及如何使用Python-Markdown库将Markdown文本转换为HTML(超文本标记语言)文 ...

  9. Git提交历史优化指南:两步合并本地Commit,代码审查更高效!

    在开发过程中,频繁的本地Commit可能导致提交历史冗杂,增加代码审查和维护的复杂度.通过合并连续的Commit,不仅能简化历史记录,还能提升代码可读性和团队协作效率,以下是合并两次本地Commit的 ...

  10. Redis 相关

    高并发多机的时候,虽然有失效时间,但还是会有短时间内缓存和数据库数据不一致(读操作不需要特殊操作),更新操作的时候先删除缓存,再更新数据库先更新数据库,再删除缓存原子性破坏,增加队列重试 先删除缓存, ...