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("有权限");
}

六、运算符优先级 #

逻辑运算符优先级从高到低:

  1. !(非)
  2. &&(与)
  3. ||(或)
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