逻辑运算符
逻辑运算符一览
| 运算符 | 名称 | 说明 |
|---|---|---|
| && | 短路与 | 两边都为 true 时返回 true |
| & | 逻辑与 | 两边都为 true 时返回 true |
| || | 短路或 | 任意一边为 true 时返回 true |
| | | 逻辑或 | 任意一边为 true 时返回 true |
| ! | 逻辑非 | 取反 |
| ^ | 异或 | 两边不同时返回 true |
java
boolean a = true;
boolean b = false;
System.out.println(a && b); // false
System.out.println(a || b); // true
System.out.println(!a); // false
System.out.println(a ^ b); // true短路特性
&& 和 || 具有短路特性:左边条件能确定结果时,右边不执行。
& 和 | 不短路,两边都执行。
&& 短路示例
java
int a = 10;
// 左边为 false,右边不执行
if (a < 5 && ++a > 20) { }
System.out.println("a = " + a); // 10,未被改变
// & 不短路,++a 仍然执行
int b = 10;
if (b < 5 & ++b > 20) { }
System.out.println("b = " + b); // 11|| 短路示例
java
int a = 10;
// 左边为 true,右边不执行
if (a > 5 || ++a > 20) { }
System.out.println("a = " + a); // 10
// | 不短路
int b = 10;
if (b > 5 | ++b > 20) { }
System.out.println("b = " + b); // 11真值表
AND (&& / &)
| A | B | A && B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
OR (|| / |)
| A | B | A || B |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
XOR (^)
| A | B | A ^ B |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
NOT (!)
| A | !A |
|---|---|
| true | false |
| false | true |
常见用法
范围判断
java
int age = 25;
// 判断是否在范围内
if (age >= 18 && age <= 60) {
System.out.println("在工作年龄段");
}
// 判断是否在范围外
if (age < 18 || age > 60) {
System.out.println("不在工作年龄段");
}多条件组合
java
int age = 25;
boolean hasLicense = true;
boolean hasInsurance = true;
// 所有条件都满足
if (age >= 18 && hasLicense && hasInsurance) {
System.out.println("可以租车");
}
// 任意条件不满足
if (age < 18 || !hasLicense || !hasInsurance) {
System.out.println("不符合条件");
}异或切换状态
java
boolean toggle = false;
toggle = !toggle; // true
toggle = !toggle; // false优先级
! > && > ||java
boolean result = !true && false; // (!true) && false = false
boolean result2 = true || false && false; // true || false = true建议用括号明确优先级。
德摩根定律
!(A && B) = !A || !B
!(A || B) = !A && !Bjava
// 原始
if (!(age >= 18 && age <= 60)) { ... }
// 简化后
if (age < 18 || age > 60) { ... }两个建议
优先使用短路运算符 && 和 ||,性能更好:
java
// ✅ 推荐:obj 为 null 时不调用 isValid()
if (obj != null && obj.isValid()) { ... }
// ❌ 不推荐:obj 为 null 时仍会调用,导致 NPE
if (obj != null & obj.isValid()) { ... }避免复杂条件,提取为方法:
java
// ❌ 难以理解
if ((a > 10 && b < 20) || (c == 5 && d != 10) || e > 100) { ... }
// ✅ 清晰
if (isValidCondition() || isSpecialCase() || isLargeValue()) { ... }简化技巧
java
// ❌ condition == true
if (condition == true) { ... }
// ✅
if (condition) { ... }
// ❌ condition == false
if (condition == false) { ... }
// ✅
if (!condition) { ... }