以下是 Java 运算符终极指南,包含 全类别详解 + 实战应用陷阱,助您深入掌握运算逻辑:
一、运算符分类速览
类型 | 运算符示例 | 核心用途 | 优先级顺序参考 |
---|---|---|---|
算术运算符 | + - * / % ++ -- | 数值计算 | 中等 |
关系运算符 | > < >= <= == != | 条件判断 | 较低 |
逻辑运算符 | && || ! | 布尔逻辑控制 | 中等 |
位运算符 | & | ^ ~ << >> >>> | 二进制位操作 | 较低 |
赋值运算符 | = += -= *= /= %= ... | 变量赋值与快捷操作 | 最低 |
条件运算符 | ? : | 简化if-else结构 | 特殊 |
类型检查符 | instanceof | 对象类型验证 | 特殊 |
杂项 | -> :: (Lambda相关) | 函数式操作 | -- |
二、运算符深度解析
1. 算术运算符
<JAVA>
int a = 10 / 3; // 结果为3(整数除法截断)
double b = 10 / 3.0; // 3.333...
int c = -10 % 3; // -1(符号跟随被除数)
// 前缀与后缀自增
int x = 5;
int y = x++; // y=5, x=6(后增)
int z = ++x; // z=7, x=7(先增)
陷阱:
- 整数除法的截断误差(如
5 / 2 = 2
) +=
包含隐式类型转换:byte b=1; b += 2;
✔️ 但b = b + 2;
❌(类型提升为int)
2. 关系运算符
<JAVA>
"hello" == "hello" // true(字符串字面量缓存)
new String("hi") == new String("hi") // false(对象地址不同)
"HI".equalsIgnoreCase("hi") // true(内容匹配推荐方式)
关键区别:
==
比较基本类型值或对象引用地址.equals()
比较对象内容(需重写,默认同==)
3. 逻辑与位运算符
类型 | 运算符 | 特点 | 示例 |
---|---|---|---|
逻辑与 | && | 短路求值(左false跳过右) | (a > 0) && (b/a > 1) |
逻辑或 | || | 短路求值(左true跳过右) | (str == null) || str.isEmpty() |
位与 | & | 必须计算两侧 | flags & MASK |
异或 | ^ | 位不同为1,同为0 | a ^ b 交换变量的无临法 |
无符号右移 | >>> | 高位填0(负数变正) | -8 >>> 1 = 2147483644 |
技巧:
a ^= b; b ^= a; a ^= b;
→ 无需临时变量交换数值(num & 1) == 0
→ 快速判断偶数
4. 赋值运算符
<JAVA>
int[] arr = {1,2};
arr[0] ^= arr[1]; // arr[0] = 1 ^ 2 = 3
arr[1] ^= arr[0]; // arr[1] = 2 ^ 3 = 1
arr[0] ^= arr[1]; // arr[0] = 3 ^ 1 = 2 → 交换完成
注意:
x += y
等价于x = (T)(x + y)
(自动强制转换,T为x的原类型)- 复合操作不会自动提升变量类型:
short s=5; s = s + 2;
报错 → 必须用s += 2;
5. 运算符优先级全表
优先级 | 运算符 | 结合方向 |
---|---|---|
1 | () . new [] | 左→右 |
2 | ! ~ ++ -- +(正) -(负) (类型) | 右→左 |
3 | * / % | 左→右 |
4 | + - | 左→右 |
5 | << >> >>> | 左→右 |
6 | < <= > >= instanceof | 左→右 |
7 | == != | 左→右 |
8 | & | 左→右 |
9 | ^ | 左→右 |
10 | | | 左→右 |
11 | && | 左→右 |
12 | || | 左→右 |
13 | ?: | 右→左 |
14 | = += -= *= /= 赋值类 | 右→左 |
记忆口诀:单目运算乘除模,加减移位比等于,位逻条赋右到左。
三、鲜为人知的高级用法
1. 布尔型不可逆运算
<JAVA>
boolean active = true;
active &= (status > 0); // 等价于 active = active & (status>0)
2. 位操作高效存储
<JAVA>
// 使用int存储32个开关状态(每位代表一个开关)
int flags = 0;
flags |= 0b1 << 3; // 打开第3位开关
boolean isOn = (flags & (0b1 << 3)) != 0; // 检查第3位
四、高频陷阱警示
-
浮点数比较
<JAVA>
double d1 = 0.1 + 0.2; double d2 = 0.3; System.out.println(d1 == d2); // false → 应使用误差范围判断
-
逻辑运算符短路屏蔽副作用
<JAVA>
int i = 0; if (false && (i++ > 0)) {} → i仍为0(因右侧未执行)
-
null instanceof
<JAVA>
String s = null; System.out.println(s instanceof String); // false(无NullPointerException)
通过系统性掌握这些运算符规则,您将能有效规避代码中的隐藏Bug,并编写出更高效的Java程序。