Java运算符共分为7大类:算术、关系、位、逻辑、赋值、条件、其他(如instanceof、->);其中++/--兼具算术与一元特性,复合赋值隐含类型转换,==比较引用而非内容。

Java运算符按功能分哪几类?
Java运算符共分为7大类,不是6类也不是8类——这是JDK规范和《Java语言规范》明确划分的,实际编码中必须按这个结构理解,否则容易混淆行为逻辑。
-
算术运算符:+、-、*、/、%、++、--(注意:++/--既算算术又属一元运算) -
关系运算符:==、!=、>、=、boolean,且==对引用类型比较的是地址) -
逻辑运算符:&&、||、!(短路)、&、|、^(非短路,也用于位运算) -
位运算符:&、|、^、~、>、>>>(注意>>是无符号右移,>>带符号) -
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、>=、>>>=(共12个,不是只有+=那些) -
条件运算符:? :(唯一三元运算符,两个分支表达式类型需兼容) -
其他运算符:instanceof(类型检查)、->(Lambda参数与体分隔)
为什么==不能直接比字符串?
因为==在Java中永远比较的是引用是否指向同一块内存,而不是内容是否相等。String是引用类型,字面量常量池里的"abc"和new String("abc")用==结果一定是false。
- 正确做法永远是用
.equals(),如str1.equals(str2) - 若str1可能为
null,推荐用Objects.equals(str1, str2)避免NPE -
==只适合基本类型(如int a == int b)或确认是同一对象引用的场景(比如单例判断)
i++ + ++i这种写法到底怎么算?
这不是“面试题陷阱”,而是真实会引发维护灾难的写法——它依赖求值顺序,而Java虽定义了操作数从左到右求值,但自增副作用的时机叠加会让结果极难推演,且不同JDK版本优化下行为未必一致。
- 以
int i = 3; int x = i++ + ++i;为例: → 先取i++的值3,然后i变成4; → 再执行++i,i先变5再取值5; → 所以x = 3 + 5 = 8(不是7,上文某些资料示例有误) - 但真正的问题不在结果,而在可读性:没人能一眼看懂,IDE通常会警告
Assignment has no effect或Expression has no effect - 实操建议:禁止在同一个表达式里对同一变量多次修改,拆成多行,例如:
int temp = i;
i++;
i++;
int x = temp + i;
复合赋值如b += 2为什么比b = b + 2更安全?
因为+=等复合赋值运算符隐含强制类型转换,而+是纯算术运算,会触发类型提升规则,导致编译失败。
立即学习“Java免费学习笔记(深入)”;
- 例如:
byte b = 1; b += 2;✅ 合法,等价于b = (byte)(b + 2) - 但
byte b = 1; b = b + 2;❌ 编译报错:`possible loss of precision`,因为b + 2被提升为int,不能直接赋给byte - 同理适用于
short、char等窄类型变量
最易被忽略的一点:位运算符&、|、^在布尔表达式里是非短路的,和&&、||行为完全不同——如果你写了methodA() & methodB(),哪怕methodA()返回false,methodB()依然会被调用。这点在含副作用的函数调用中极易埋雷。








