Java逻辑运算符完全指南:短路与、非短路或、异或的妙用,一篇搞定!

一、什么是逻辑运算符?

逻辑运算符用于连接多个布尔表达式(即返回值为 truefalse 的表达式),根据逻辑规则(如与、或、非)对表达式进行运算,最终得到一个布尔值。


二、基础逻辑运算符(3种)

1、&&逻辑与(短路与)

语法:

java 复制代码
boolean a = true, b = false;
System.out.println(a && b);  // false(全真才真)

说明:

  • 当第一个表达式为 false 时,Java 不再判断第二个表达式,直接返回 false。这种行为称为"短路"
  • 常用于防止空指针异常
java 复制代码
if (obj != null && obj.getValue() > 10) {
    // 安全执行 obj.getValue()
}

2、||逻辑或(短路或)

语法:

java 复制代码
boolean a = true, b = false;
System.out.println(a || b);  // true(有真即真)

说明:

  • 当第一个表达式为 true 时,Java 会跳过第二个表达式的计算
  • 常用于提供备选条件
java 复制代码
if (user.isAdmin() || user.hasPermission("EDIT")) {
    // 允许访问
}

3、!逻辑非

语法:

java 复制代码
boolean a = true,
System.out.println(!a);      // false(取反)

说明:

  • 对布尔表达式取反
  • 常用于状态切换条件反向
java 复制代码
if (!isValid) {
    System.out.println("数据无效!");
}

四、非短路逻辑运算符(2种)和异或(1种)

& | ^被同时用于逻辑运算位运算,源于编程语言的语法设计:当操作数为布尔值时执行逻辑运算,为整数时执行位运算。

1、&与|(非短路)

与&&和|的异同:

  • 相同点:对于逻辑运算&&和&与||和|运算返回结果一致
  • 不同点:&|始终计算两个表达式,无论第一个表达式的值如何
java 复制代码
boolean result = (a > 0) & (b++ > 0);  // b 一定会自增

2、^异或

语法:

java 复制代码
System.out.println(true ^ true);   // false
System.out.println(false ^ false); // false
System.out.println(true ^ false);  // true

说明:

  • 两个表达式一个为真,一个为假时,结果才为 true
  • 实际上可以用于检查两个状态是否"互斥"
java 复制代码
boolean isSingle = true;
boolean isMarried = false;
if (isSingle ^ isMarried) {
    System.out.println("状态有效");
}

五、逻辑运算符优先级

优先级从高到低(部分):

  1. ! (逻辑非)
  2. &&(逻辑与)
  3. ||(逻辑或)
java 复制代码
// 复杂表达式示例
boolean result = !false || true && false;
// 等价于:(true) || (true && false) → true

// 使用括号明确意图(推荐!)
boolean safeResult = (!false) || (true && false);

总结

&&、|| 和 ! 是逻辑运算符,用于布尔值判断,返回布尔值;而 &、|、^ 是常用于按位运算符,用于按位操作整数,返回整数(下篇文章细讲),这里&、|、^ 也可以用于逻辑运算符。

运算符 名称 描述
&& 逻辑与(AND) 两个条件都为 true 时,结果为 true
` `
! 逻辑非(NOT) 取反操作,将 true 变成 false,反之亦然
& 位与 逻辑与运算但不会短路(始终计算两侧表达式)
` ` 位或
^ 异或 两个条件不同为 true,相同为 false
相关推荐
清水1 小时前
Spring Boot企业级开发入门
java·spring boot·后端
星释1 小时前
Rust 练习册 :Proverb与字符串处理
开发语言·后端·rust
ZZHHWW2 小时前
RocketMQ vs Kafka01 - 存储架构深度对比
后端
依_旧3 小时前
MySQL下载安装配置(超级超级入门级)
java·后端
熊小猿3 小时前
RabbitMQ死信交换机与延迟队列:原理、实现与最佳实践
开发语言·后端·ruby
淘源码d3 小时前
什么是医院随访系统?成熟在用的智慧随访系统源码
java·spring boot·后端·开源·源码·随访系统·随访系统框架
武子康3 小时前
大数据-147 Java 访问 Apache Kudu:从建表到 CRUD(含 KuduSession 刷新模式与多 Master 配置)
大数据·后端·nosql
2301_795167203 小时前
玩转Rust高级应用 如何让让运算符支持自定义类型,通过运算符重载的方式是针对自定义类型吗?
开发语言·后端·算法·安全·rust
程序猿阿越4 小时前
Kafka源码(七)事务消息
java·后端·源码阅读
ArabySide4 小时前
【Spring Boot】REST与RESTful详解,基于Spring Boot的RESTful API实现
spring boot·后端·restful