java中&&和||是短路逻辑运算符,左侧结果确定整体真假时跳过右侧执行;&和|是位运算符,在布尔上下文中不短路,总执行两侧表达式。

Java 中的 && 和 || 是带短路特性的逻辑运算符,而 & 和 | 在布尔上下文中虽可作逻辑运算,但不短路——这是二者最本质的区别。理解它,关键不在“结果是否一样”,而在“右侧表达式会不会被执行”。
短路与(&&):左假则右不执行
当左侧表达式为 false 时,整个 && 表达式结果必为 false,JVM 直接跳过右侧求值。
- 安全防护典型用法:
if (obj != null && obj.getName().length() > 0)—— 若obj为null,obj.getName()根本不会调用,避免空指针异常 - 副作用规避:
if (false && doSomething())中,doSomething()完全不运行 - 注意:
&没有这个保护:if (obj != null & obj.getName().length() > 0)即使obj为null,也会尝试调用getName(),抛出异常
短路或(||):左真则右不执行
当左侧表达式为 true 时,整个 || 表达式结果必为 true,右侧被跳过。
- 效率与语义兼顾:
if (user.isAdmin() || user.hasPermission("edit"))—— 管理员身份已满足条件,无需再查权限 - 避免冗余操作:
if (true || connectToDatabase())中,数据库连接不会发起 - 对比
|:if (true | connectToDatabase())会强制执行右侧,哪怕毫无必要
& 和 | 不是“慢一点的 &&/||”,而是语义不同
& 和 | 本质是位运算符,在布尔场景下只是“重载使用”。它们总是计算两边,不关心逻辑含义,也不做流程控制。
- 副作用必然发生:
boolean b = (a > 0) & (c++ > 0)—— 无论a > 0结果如何,c都会自增 - 适合需要双侧求值的极少数场景,比如同时触发两个状态检查、日志埋点或硬件寄存器轮询
- 日常条件判断中用
&或|替代&&/||,不是优化,而是埋雷
优先级与混合使用需警惕
&& 优先级高于 ||,且短路行为严格按运算符分组生效。例如:
-
a && b || c等价于(a && b) || c - 若
a为false,a && b短路,b不执行;接着判断c - 不要依赖模糊写法,复杂条件建议加括号明确意图,或拆成多个 if
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











