Java 编程中的运算符探寻 🚀
Java 运算符是表达式计算的核心,掌握它们能让你写出高效、清晰的代码,避免优先级陷阱。本文从基础到进阶,带你全面探寻 Java 运算符(基于 Java 21/23 最新特性,2026 年仍适用)。
1. 运算符分类总览
Java 运算符大致分为以下几类:
| 类别 | 运算符示例 | 作用说明 |
|---|---|---|
| 算术运算符 | + - * / % | 加减乘除取余 |
| 一元运算符 | + - ++ -- ! ~ | 正负、自增自减、逻辑非、按位非 |
| 赋值运算符 | = += -= *= /= %= &= ^= |= <<= >>= >>>= | 赋值及复合赋值 |
| 关系(比较)运算符 | == != > < >= <= instanceof | 比较大小、相等、类型检查 |
| 逻辑运算符 | && || ! | 短路与、短路或、逻辑非 |
| 位运算符 | & | ^ ~ << >> >>> | 按位与、或、异或、非、移位 |
| 条件(三元)运算符 | ? : | 条件表达式 |
| 其他 | . [] () -> :: | 成员访问、数组、方法引用等 |
注意:Java 不支持运算符重载(C++ 支持)。+ 对 String 是特殊处理(拼接),不是重载。
2. 运算符优先级表(核心!强烈建议收藏)
优先级从高到低(数字越小优先级越高),同一优先级按结合性(左结合或右结合)计算。括号 () 永远最高。
| 优先级 | 运算符 | 结合性 | 说明 |
|---|---|---|---|
| 1 | () [] .(方法调用、数组、成员访问) | 左→右 | 最高 |
| 2 | ++ --(后缀) | 左→右 | 后自增自减 |
| 3 | ++ -- + - ! ~(前缀) | 右←左 | 前自增自减、正负、逻辑非、按位非 |
| 4 | * / % | 左→右 | 乘除取余 |
| 5 | + - | 左→右 | 加减(或字符串拼接) |
| 6 | << >> >>> | 左→右 | 移位运算 |
| 7 | < <= > >= instanceof | 左→右 | 关系比较、类型判断 |
| 8 | == != | 左→右 | 相等性判断 |
| 9 | & | 左→右 | 按位与(也可用于布尔) |
| 10 | ^ | 左→右 | 按位异或 |
| 11 | | | 左→右 | 按位或 |
| 12 | && | 左→右 | 逻辑与(短路) |
| 13 | || | 左→右 | 逻辑或(短路) |
| 14 | ? : | 右←左 | 三元条件 |
| 15 | = += -= *= /= %= &= ^= |= <<= >>= >>>= | 右←左 | 赋值(最低) |
记忆技巧:
- 单目 > 算术 > 移位 > 关系 > 相等 > 位 > 逻辑 > 三元 > 赋值
- 逻辑运算符优先级:
! > && > || - 位运算优先级高于逻辑运算符(
& > &&)
经典陷阱示例:
int x = 5;
int y = 10;
boolean result = x > 3 && y++ > 10; // y++ 会执行吗?(短路后不执行)
System.out.println(y); // 输出 10(短路)
3. 各类型运算符详解 + 代码示例
3.1 算术运算符
- 注意:整数除法会截断小数(
5/2 == 2) %对负数结果符号与被除数一致
int a = 10, b = 3;
System.out.println(a / b); // 3
System.out.println(a % b); // 1
System.out.println(a + " " + b); // 字符串拼接: "10 3"
3.2 自增自减(++ --)
- 前缀(
++i):先增后用 - 后缀(
i++):先用后增
int i = 5;
System.out.println(++i); // 6
System.out.println(i++); // 6(输出后 i=7)
3.3 关系与 instanceof
instanceof:运行时类型检查(Java 14+ 支持模式匹配)
Object obj = "Hello";
if (obj instanceof String s) { // Java 14+ 模式匹配
System.out.println(s.toUpperCase());
}
3.4 逻辑运算符(短路特性!重要)
&&:左边 false 则右边不执行||:左边 true 则右边不执行
boolean flag = false;
int count = 0;
if (flag && ++count > 0) { } // ++count 不执行
System.out.println(count); // 0
3.5 位运算符(面试高频)
常用于权限控制、状态标记、算法优化。
int a = 0b1010; // 10(二进制)
int b = 0b1100; // 12
System.out.println(a & b); // 8 (1000)
System.out.println(a | b); // 14 (1110)
System.out.println(a ^ b); // 6 (0110)
System.out.println(~a); // -11(按位取反)
// 移位
System.out.println(8 << 2); // 32(左移乘4)
System.out.println(8 >> 2); // 2
System.out.println(-8 >>> 2); // 无符号右移(高位补0)
实用技巧:
- 判断奇偶:
n & 1 == 1 - 交换两数(不用临时变量):
a ^= b; b ^= a; a ^= b;
3.6 三元运算符(? :)
int max = a > b ? a : b;
String status = score >= 60 ? "及格" : "不及格";
3.7 赋值运算符
复合赋值会自动进行类型转换(byte b = 1; b += 1; 合法)
4. 优先级与结合性常见坑点
// 坑1:位运算与逻辑混用
boolean res = 5 > 3 & 4 > 2; // & 是位运算,这里对 boolean 也有效,但无短路!
// 推荐用 &&
// 坑2:赋值优先级最低
int x, y, z;
x = y = z = 5; // 右结合,从右到左赋值
建议:复杂表达式一定要加括号,提高可读性。
5. Java 特殊运算符
- 方法引用
::(Java 8+):list.forEach(System.out::println) - Lambda
->:(x, y) -> x + y - 点
.、数组[]、强制类型转换(Type)
6. 最佳实践与注意事项
- 始终用括号明确意图,避免依赖优先级记忆。
- 短路运算符(
&& ||)用于性能优化和防止空指针(obj != null && obj.method())。 - 位运算适合高性能场景(如游戏、加密、权限)。
- 避免在生产代码中使用复杂位运算,除非有清晰注释。
- Java 21+:记录类(Record)、模式匹配等让
instanceof更强大。 - 调试技巧:用 IDE(如 IntelliJ)查看表达式求值顺序。
总结口诀:
单目算术移位关,关系相等位在先;
逻辑三元赋值后,括号永远最优先!
掌握运算符后,你的 Java 表达式会更优雅,面试中“运算符优先级”题也能轻松应对。
想继续深入吗?
回复以下任意内容,我立刻带你探索:
- “位运算 20 道实战题 + 权限控制示例”
- “运算符优先级 15 道经典面试题(带解析)”
- “Java 8+ 新特性中的运算符(Lambda、::、模式匹配)”
- “与 C++/Python 运算符对比”
- “手写一个位运算实现权限管理系统小项目”
- “表达式求值完整练习”
或者直接说:“给我运算符综合练习题 10 道”。
有疑问随时问,我们把 Java 基础运算符彻底玩透!💪