java逻辑运算符短路特性是性能优化工具,需将轻量高决定性判断置左:&&放高失败率检查(如null判断),||放高成功率检查(如缓存命中),以跳过耗时/副作用操作并防异常。

Java 中逻辑运算符的短路特性(&& 和 ||)不只是语法糖,而是可主动设计的性能优化工具。关键不在于“用了短路”,而在于“让短路真正起效”——即左侧条件能高频、快速地终止整个表达式,从而跳过右侧那些耗时、易错或副作用强的操作。
把轻量且高决定性的判断放左边
短路只跳过右侧表达式,左侧永远执行。所以左侧必须是开销小、结果确定性强的检查:
-
&& 场景:优先放失败率高的轻量判断,如
obj != null、list != null && !list.isEmpty()、str != null && !str.trim().isEmpty() -
|| 场景:优先放成功率高的轻量判断,如
isCached()(缓存命中快)、userRole == ADMIN(枚举比对快)、config.isFeatureEnabled()(配置读取快) - 反例要避免:像
loadFromDB() && validateInput(),每次都会查库,短路完全失效
用短路做安全防护,顺带省性能
它天然适合规避运行时异常,尤其在访问不确定对象或资源时,既提升健壮性,又避免无谓调用:
- 防空指针:
user != null && user.getProfile() != null && user.getProfile().getEmail() != null - 防除零:
divisor != 0 && value % divisor == 0 - 防越界:
index >= 0 && index 0 - 防文件异常:
Files.exists(path) && Files.isReadable(path) && Files.readString(path).contains("key")
警惕副作用和隐式真假值陷阱
短路依据的是 truthy/falsy 判断(Java 中即 boolean 值),但副作用表达式放在右侧会导致执行不可控:
- 别写
flag && doLog("start")来替代 if —— 日志可能被跳过,调试困难 - 含自增、IO、网络调用、状态变更的表达式(如
i++ > 5 && callService())应拆到独立 if 块中 - 注意假值边界:0、null、""、Boolean.FALSE 是 false;非 null 对象、非零数字、非空字符串默认为 true,但不要依赖
list && list.size() > 0(list 是 Object,永远 true)
复杂逻辑别硬堆短路,该拆就拆
短路不是万能加速器。嵌套过深(如 a && b && c && d && e && f())会损害可读性,JIT 编译也可能降效:
- 涉及 await 的场景:
await loadUser() && await checkPermission()中,loadUser()总是先 await 完,无法异步短路 - 高频或业务复杂的判定,建议封装成语义清晰的方法,再组合使用短路,例如:
isValidRequest(req) && hasQuota(user) && isRateLimitOk() - 当条件超过 3 个,或任一条件本身含方法调用+判断时,分步 if 更利于调试和维护
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











