在 for 循环的更新表达式中,i++ 与 ++i 效果完全相同,均用于每次循环体执行后对计数器加 1;关键在于避免在条件判断或赋值等复合表达式中混用前置/后置自增导致时序混乱。

在 Java 循环中使用自增运算符,核心是明确 位置(前置 vs 后置) 和 用途(单独更新 vs 复合表达式)。只要不把它塞进条件判断或赋值逻辑里搅乱时序,就基本不会出错。
循环中自增的本质作用是更新计数器
for 循环第三部分(更新表达式)里的 i++ 或 ++i,只是每次循环体执行完后对变量做一次加 1 操作。此时两者效果完全一样:
for (int i = 0; i —— 先执行循环体,再 <code>i加 1for (int i = 0; i —— 先 <code>i加 1,再进入下一轮判断- 无论哪种写法,循环都执行 5 次(i 取值为 0~4),退出时 i 都是 5
别把自增塞进 while 或 if 的条件里
在条件表达式中混用自增,容易导致边界混乱或越界异常:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ❌
while (i++ :i 从 0 开始,第 10 次判断时 i 是 9,条件为真,进入循环体;执行完 i 变成 10;下次判断前 i 已是 10,但 ++ 已发生,实际比较的是 10 <li>❌ <code>if (arr[i++] != null):当 i 等于arr.length时,先尝试访问arr[i],直接抛ArrayIndexOutOfBoundsException - ✅ 更安全的写法:
if (i ,利用短路特性提前拦截
前置和后置只在参与计算时才有区别
如果自增是独立语句,或只用于更新循环变量,i++ 和 ++i 完全等价:
立即学习“Java免费学习笔记(深入)”;
-
i++;和++i;都让 i 增加 1,无其他副作用 - 区别只出现在它被“用到值”的场景:比如赋值、传参、参与算术运算
- 例如:
list.add(i++);添加的是旧值;list.add(++i);添加的是新值
多线程环境下不能依赖 i++
即使只是简单循环计数,若多个线程共用同一个 int 变量并执行 i++,结果不可预期:
- 因为
i++不是原子操作:读取 i → 计算 i+1 → 写回 i,三步可能被中断 -
volatile无法解决这个问题,只能保证可见性,不保证原子性 - 需要线程安全计数时,改用
AtomicInteger:counter.incrementAndGet()

















