Java中逻辑与(&&)和逻辑或(||)采用短路求值:&&在左操作数为false时跳过右操作数,||在左操作数为true时跳过右操作数;而&和|无短路特性且支持位运算,日常条件判断应优先使用&&和||。

Java中的逻辑与(&&)和逻辑或(||)不是简单地“两边都算完再判断”,而是短路求值——只要能确定最终结果,就立刻停止计算右边表达式。这是正确使用它们的关键。
逻辑与(&&):左边为false时,右边不执行
表达式 a && b 的行为是:
- 先计算 a;
- 如果 a 为 false,整个结果一定是 false,跳过 b 的计算;
- 只有当 a 为 true 时,才继续计算 b,并以 b 的值作为最终结果。
常见用途:
-
避免空指针异常:如
str != null && str.length() > 0,如果str是null,就不会调用length()。 -
条件依赖执行:如
user.isLoggedIn() && user.hasPermission("delete"),未登录时不会检查权限。
逻辑或(||):左边为true时,右边不执行
表达式 a || b 的行为是:
- 先计算 a;
- 如果 a 为 true,整个结果一定是 true,跳过 b 的计算;
- 只有当 a 为 false 时,才计算 b,并以 b 的值作为最终结果。
常见用途:
-
提供默认值:如
name != null && !name.trim().isEmpty() ? name : "anonymous",但更简洁写法常配合 || 与非空判断结合(注意类型需一致);实际中常用Objects.toString(obj, "default")更安全。 -
快速失败兜底:如
cache.get(key) != null || loadFromDB(key) != null,缓存没命中才查库。
别混淆 & 和 |:它们不短路,且还能位运算
& 和 | 是按位运算符,也支持布尔类型,但没有短路特性:
- a & b:无论 a 是什么,b 都会执行;
- a | b:同样,b 总是会被计算。
除非你明确需要强制执行右侧逻辑(比如右侧有副作用,如日志、计数),否则日常条件判断中应优先用 && 和 ||。
⚠️ 注意:在 if 或 while 中误写成 & 可能引发空指针或多余计算,不易察觉。
小技巧:用短路特性简化嵌套判断
把多层 if 拆成一行短路表达式,更清晰也更安全:
立即学习“Java免费学习笔记(深入)”;
- 原来写法:
if (list != null) {
if (!list.isEmpty()) {
if (list.get(0) != null) {
doSomething(list.get(0));
}
}
}
- 用
&&简化:
if (list != null && !list.isEmpty() && list.get(0) != null) {
doSomething(list.get(0));
}
每一环都天然保护后一环,可读性高,也不怕 NPE。
基本上就这些。记牢“短路”二字,就能避开大部分误用和潜在 bug。










