短路与(&&)不执行右侧表达式,逻辑与(&)强制执行右侧;日常用&&防空指针、跳过耗时操作,&仅用于需双重副作用、位运算或特定测试场景。

短路与(&&)和逻辑与(&)都要求两边是布尔值、结果也是布尔值,但关键区别在于:是否强制执行右侧表达式。日常开发中绝大多数情况该用 &&,只有明确需要“两边都必须执行”的场景才选 &。
短路与 &&:安全高效,日常首选
当左侧为 false 时,右侧表达式完全不执行——这既是性能优化,更是避免异常的关键机制。
- 防止空指针:比如
user != null && user.isActive(),user 为 null 时不会调用isActive() - 跳过耗时操作:如
isValidInput() && saveToDatabase(),输入无效就跳过保存 - 控制执行顺序:右侧可能有副作用(如计数器++、日志打印),用 && 可确保它只在必要时发生
逻辑与 &:强制求值,慎用但不可替代
& 不管左边真假,右边一定执行。这不是 bug,而是设计用途:
- 需要双重副作用:例如两个方法都必须记录审计日志,不能因第一个失败就跳过第二个
- 位运算上下文:当操作数是整数(如
flags & PERMISSION_READ),这时 & 是位与,不是逻辑运算 - 单元测试断言:某些测试框架要求所有条件都被检查,避免漏掉隐藏问题
别混淆优先级和括号习惯
&& 和 & 优先级不同(&& 低于 &),混用极易出错。更稳妥的做法是:
- 同一表达式里不混用 && 和 &
- 复杂条件一律加括号,比如
(a || b) && c,不依赖记忆优先级 - IDE 警告 “Condition is always true/false” 往往提示短路已让某分支失效,要回头检查逻辑是否被意外截断
一个典型误用对比
看这段代码:
int x = 5; boolean result1 = (x > 10) && (x++ > 0); // x 保持 5,右侧未执行 boolean result2 = (x > 10) & (x++ > 0); // x 变成 6,右侧强制执行
如果你本意是“只在条件成立时才自增”,用了 & 就会破坏逻辑;反之,若必须保证自增发生,却用了 &&,就漏掉了预期行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











