Java整数除法向零取整、取模符号同被除数;i=i++因先取旧值再赋值致结果不变;byte/short/char运算自动提升为int需显式强转;字符串拼接中+遇String即转拼接且左结合。

Java 运算符看着简单,但日常写代码时一不留神就掉坑里——整数除法结果被截断、取模符号搞反、自增逻辑绕晕人、字符串拼接优先级打乱预期……这些都不是“语法错误”,而是运行时才暴露的逻辑偏差。避开它们,关键不是死记规则,而是理解 Java 在每一步做了什么。
整数除法和取模:别把数学直觉当 Java 行为
Java 对整数做 / 和 % 时,严格按“向零取整”执行:
- 10 / 3 得 3,不是 3.33;-10 / 3 也得 -3(不是 -4)
- 取模结果的符号永远和被除数一致:-10 % 3 = -1,10 % -3 = 1,-10 % -3 = -1
- 需要小数结果?至少让其中一个操作数是浮点型:
(double) a / b或a / (double) b - 想实现“向下取整余数”(比如循环索引),可用
Math.floorMod(a, b),它返回非负结果
自增/自减:后置操作不是“先用再加”,而是“用旧值,再变新值”
写 i = i++ 得到 0,不是因为 JVM 犯傻,而是执行顺序明确:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 读取 i 当前值(比如 0)→ 记作“待赋值的值”
- i 自身加 1(i 变成 1)
- 把刚才记下的旧值(0)赋给 i → i 最终还是 0
- 所以
i = i++和i = ++i完全不同;后者是先加再赋,结果是 1 - 多线程中
++i依然不安全,它由“读-改-写”三步组成,要用AtomicInteger替代
类型提升与赋值:byte/short/char 运算后不再是 byte/short/char
Java 规定:byte、short、char 在参与任何算术运算时,自动提升为 int,哪怕只是两个 byte 相加:
立即学习“Java免费学习笔记(深入)”;
-
byte b1 = 10; byte b2 = 20; byte r = b1 + b2;编译失败——因为b1 + b2结果是int,不能直接赋给byte - 正确写法是显式强转:
byte r = (byte)(b1 + b2); - 但
b1 += b2能过编译,因为复合赋值运算符隐含了类型收缩(等价于b1 = (byte)(b1 + b2)) - 同理,
char c = 'a'; c = c + 1;会报错;而c += 1;没问题
字符串拼接与 + 号优先级:+ 遇到 String 就变身
+ 是重载运算符:两边全是数值时做加法;只要有一边是 String,就立刻切换为字符串拼接模式,且从左到右依次执行:
-
"a" + 1 + 2→"a1" + 2→"a12"(不是"a3") -
1 + 2 + "a"→3 + "a"→"3a" - 想先算数字再拼接?加括号:
1 + (2 + "a")或(1 + 2) + "a" - 频繁拼接建议用
StringBuilder,避免隐式创建多个中间 String 对象

















