Java逻辑运算符 #
一、逻辑运算符概述 #
逻辑运算符用于连接布尔表达式,结果为布尔值。
| 运算符 | 说明 | 示例 |
|---|---|---|
| && | 短路与 | true && false → false |
| || | 短路或 | true || false → true |
| ! | 逻辑非 | !true → false |
| & | 逻辑与 | true & false → false |
| | | 逻辑或 | true | false → true |
| ^ | 逻辑异或 | true ^ false → true |
二、基本逻辑运算 #
2.1 与运算(&&) #
两个操作数都为true,结果才为true。
java
System.out.println(true && true); // true
System.out.println(true && false); // false
System.out.println(false && true); // false
System.out.println(false && false); // false
2.2 或运算(||) #
只要有一个操作数为true,结果就为true。
java
System.out.println(true || true); // true
System.out.println(true || false); // true
System.out.println(false || true); // true
System.out.println(false || false); // false
2.3 非运算(!) #
取反操作。
java
System.out.println(!true); // false
System.out.println(!false); // true
System.out.println(!!true); // true
2.4 异或运算(^) #
两个操作数不同时结果为true。
java
System.out.println(true ^ true); // false
System.out.println(true ^ false); // true
System.out.println(false ^ true); // true
System.out.println(false ^ false); // false
三、短路求值 #
3.1 短路与(&&) #
如果左边为false,右边不执行。
java
int a = 5;
// 短路与:左边为false,右边不执行
boolean result = (a > 10) && (a++ > 0);
System.out.println(a); // 5(a++未执行)
// 逻辑与:两边都执行
boolean result2 = (a > 10) & (a++ > 0);
System.out.println(a); // 6(a++执行了)
3.2 短路或(||) #
如果左边为true,右边不执行。
java
int a = 5;
// 短路或:左边为true,右边不执行
boolean result = (a > 0) || (a++ > 10);
System.out.println(a); // 5(a++未执行)
// 逻辑或:两边都执行
boolean result2 = (a > 0) | (a++ > 10);
System.out.println(a); // 6(a++执行了)
3.3 短路求值的应用 #
java
// 避免空指针异常
String s = null;
// 安全:先判断null,如果为true,右边不执行
if (s != null && s.length() > 0) {
System.out.println("字符串不为空");
}
// 不安全:可能抛出NullPointerException
// if (s.length() > 0 && s != null) { }
// 除法前检查除数
int a = 10;
int b = 0;
if (b != 0 && a / b > 0) {
System.out.println("结果为正");
}
四、逻辑运算真值表 #
4.1 与运算真值表 #
| A | B | A && B | A & B |
|---|---|---|---|
| true | true | true | true |
| true | false | false | false |
| false | true | false | false |
| false | false | false | false |
4.2 或运算真值表 #
| A | B | A || B | A | B |
|---|---|---|---|
| true | true | true | true |
| true | false | true | true |
| false | true | true | true |
| false | false | false | false |
4.3 异或运算真值表 #
| A | B | A ^ B |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
五、条件语句中的应用 #
5.1 复合条件 #
java
int age = 25;
boolean hasLicense = true;
// 年龄>=18 且 有驾照
if (age >= 18 && hasLicense) {
System.out.println("可以驾驶");
}
// 年龄<18 或 没有驾照
if (age < 18 || !hasLicense) {
System.out.println("不能驾驶");
}
5.2 范围判断 #
java
int score = 85;
// 判断分数在60-100之间
if (score >= 60 && score <= 100) {
System.out.println("有效分数");
}
// 判断分数不在0-100之间
if (score < 0 || score > 100) {
System.out.println("无效分数");
}
5.3 多条件判断 #
java
String role = "admin";
boolean isActive = true;
// 管理员或激活的普通用户
if (role.equals("admin") || (role.equals("user") && isActive)) {
System.out.println("有权限");
}
六、运算符优先级 #
逻辑运算符优先级从高到低:
!(非)&&(与)||(或)
java
boolean a = true;
boolean b = false;
boolean c = true;
// !优先级最高
boolean r1 = !a && b; // (!a) && b = false && false = false
// &&优先级高于||
boolean r2 = a || b && c; // a || (b && c) = true || false = true
// 使用括号明确优先级
boolean r3 = (a || b) && c; // true && true = true
七、常见模式 #
7.1 输入验证 #
java
public static boolean isValidAge(int age) {
return age >= 0 && age <= 150;
}
public static boolean isValidEmail(String email) {
return email != null &&
email.contains("@") &&
email.length() > 5;
}
7.2 权限检查 #
java
public boolean canAccess(User user, Resource resource) {
return user != null &&
user.isActive() &&
(user.isAdmin() || resource.isPublic());
}
7.3 默认值设置 #
java
public String getValue(String input) {
// 如果input为null或空,使用默认值
return (input != null && !input.isEmpty()) ? input : "默认值";
}
// 或使用Java 11+
public String getValue2(String input) {
return (input == null || input.isBlank()) ? "默认值" : input;
}
7.4 德摩根定律 #
java
// !(A && B) 等价于 !A || !B
// !(A || B) 等价于 !A && !B
boolean a = true;
boolean b = false;
// 这两种写法等价
boolean r1 = !(a && b);
boolean r2 = !a || !b;
// 这两种写法也等价
boolean r3 = !(a || b);
boolean r4 = !a && !b;
八、注意事项 #
8.1 避免复杂表达式 #
java
// 不好的写法:过于复杂
if ((a > 0 && b > 0) || (c > 0 && d > 0) && !(e > 0)) {
// ...
}
// 好的写法:拆分为多个变量
boolean condition1 = a > 0 && b > 0;
boolean condition2 = c > 0 && d > 0;
boolean condition3 = e <= 0;
if ((condition1 || condition2) && condition3) {
// ...
}
8.2 注意运算顺序 #
java
int a = 5;
int b = 0;
// 错误:可能除零
// if (b != 0 & a / b > 0) { }
// 正确:使用短路运算
if (b != 0 && a / b > 0) {
System.out.println("正数");
}
8.3 布尔变量比较 #
java
boolean flag = true;
// 不推荐
if (flag == true) { }
if (flag == false) { }
// 推荐
if (flag) { }
if (!flag) { }
九、总结 #
| 运算符 | 说明 | 短路特性 |
|---|---|---|
| && | 短路与 | 左边为false,右边不执行 |
| || | 短路或 | 左边为true,右边不执行 |
| ! | 逻辑非 | 无 |
| & | 逻辑与 | 两边都执行 |
| | | 逻辑或 | 两边都执行 |
| ^ | 异或 | 两边都执行 |
逻辑运算符要点:
- 优先使用短路运算符(&&、||)
- 利用短路特性避免空指针和除零异常
- 注意运算符优先级,必要时使用括号
- 复杂条件拆分为多个变量提高可读性
最后更新:2026-03-26