从实际的编程示例中看i++与++i的区别
举一个简单的例子,我们希望给一个长字符串出现的每个字符的数量进行打表
这里给出部分代码
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
注意事项
同一表达式中多次自增可能导致不同结果:
int i = 0;
int x = i++ + ++i; // 不同编译器可能结果不同,而且难以阅读
应避免此类写法。
运算符优先级陷阱
i++的优先级高于大部分运算符,可能导致逻辑错误:
int j = 5;
int k = j++ * 2; // k=10,j=6(而非 5 * 2=10)容易犯错,还是老老实实写j+1吧
总结一句话:i在前面是原值,i在后面先计算
特性 | i++ |
++i |
---|---|---|
返回值 | 原值 | 新值 |
适用场景 | 需保留旧值的计算 | 需直接使用新值的操作 |
性能建议 | 基本类型无差异,对象类慎用 | 对象类优先使用 |
从实际的编程示例中看i++与++i的区别的更多相关文章
- Muduo 网络编程示例之零:前言
陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/ ...
- Qt 5入门指南之Qt Quick编程示例
编程示例 使用Qt创建应用程序是十分简单的.考虑到你的使用习惯,我们编写了两套教程来实现两个相似的应用程序,但是使用了 不同的方法.在开始之前,请确保你已经下载了QtSDK的商业版本或者开源版本,并且 ...
- 多线程异步编程示例和实践-Thread和ThreadPool
说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
- EOS智能合约开发(四):智能合约部署及调试(附编程示例)
EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- [Python]Excel编程示例教程(openpyxl)
1 前言(Preface) 博文背景:论文实验中有一大堆数据集需要观测其数据特征,通过人体肉眼,难以直观感受,故而准备通过生成Excel,可视化其评测数据. We know: Excel便于可视化分析 ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- Java8---函数式编程-示例
// Java8函数式编程示例—(Predicate.Stream.Optional) https://blog.csdn.net/weixin_41950473/article/details/84 ...
随机推荐
- Go红队开发—文件操作
目录 文件操作 创建目录 创建文件 获取File信息 文件重命名 删除文件 打开关闭文件 判断文件是否存在 判断文件是否有读取权限 复制文件 Read读取 ReadFull读取 ReadAtLeast ...
- Laravel11 从0开发 Swoole-Reverb 扩展包(三) - reverb广播驱动使用流程
前情提要 我们第一节的时候,已经大致介绍reverb,他 是 Laravel 应用程序的第一方 WebSocket 服务器,可将客户端和服务器之间的实时通信直接带到您的指尖.开源且只需一个 Artis ...
- python 更新pip镜像源
前言 默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,下载速度是几kb或者几十kb,花费的时间比较长. 解决办法 国内目前有些机构或者公司整理了对应的镜像源,使得通过内网就能访问即可, ...
- Windows 提权-服务_未引用的服务路径
本文通过 Google 翻译 Unquoted Service Paths – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- minio迁移工具 mc
mc mirror 命令属于 MinIO Client (mc) 工具,默认不会随 MinIO 服务器一起安装,需要 单独安装. 安装 MinIO Client (mc) Linux/macOS 执行 ...
- FastAPI中Pydantic异步分布式唯一性校验
title: FastAPI中Pydantic异步分布式唯一性校验 date: 2025/04/02 00:47:55 updated: 2025/04/02 00:47:55 author: cmd ...
- AIR780E引脚复用笔记
1.应用场景: 使用AIR780E模块驱动TM1637数码管驱动芯片,原有方案是AIR724UG+TM1637.为了降低成本,按照官方方案进行代码迁移. 伴随着代码迁移,硬件引脚也需要做相应调 ...
- Docker安装及使用,Docker 安装MySQL、安装Tomcat、安装RabbitMQ
CentOS7安装Docker Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经 ...
- Anaconda安装常用配置及命令
Anaconda历史版本下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ https://repo.anaconda.com/arch ...
- AOP流程及原理
目录 一.AOP结构介绍 @Pointcut 通知 原理 连接点 拦截器 二.Bean介入点 EnableAspectJAutoProxy AspectJAutoProxyRegistrar Anno ...