Java中短路与(&&)和短路或(||)在左侧结果可确定整体值时跳过右侧计算,而&和|无此特性;前者用于布尔逻辑防异常,后者为位运算符且必执行两侧。

Java 中的短路与(&&)和短路或(||)是逻辑运算符,它们的核心特点是:**一旦能确定整个表达式的最终结果,就不再计算右侧操作数**。这是与非短路版本(& 和 |)的关键区别。
短路与(&&)的实现逻辑
当使用 && 时,Java 先计算左侧表达式:
- 如果左侧为 false,整个表达式必定为 false,右侧表达式**不会执行**(跳过求值);
- 如果左侧为 true,才继续计算右侧表达式,并以右侧结果作为整体结果。
例如:if (str != null && str.length() > 0) —— 如果 str 为 null,左侧为 false,就不会调用 str.length(),从而避免空指针异常。
短路或(||)的实现逻辑
当使用 || 时,Java 同样先计算左侧表达式:
立即学习“Java免费学习笔记(深入)”;
- 如果左侧为 true,整个表达式必定为 true,右侧表达式**不会执行**;
- 如果左侧为 false,才继续计算右侧表达式,并以右侧结果作为整体结果。
例如:if (list == null || list.isEmpty()) —— 若 list 为 null,左侧为 true,就不会调用 list.isEmpty(),防止报错。
与非短路运算符(& 和 |)的区别
& 和 | 是位运算符,也可用于布尔运算,但**不具有短路特性**:
- a & b:无论 a 是 true 还是 false,b 都会被计算;
- a | b:无论 a 是 true 还是 false,b 也都会被计算。
因此,在涉及可能抛异常、有副作用(如方法调用、变量修改)或性能敏感的场景中,应优先使用 && 和 ||。
实际编码中的注意事项
- 短路只对布尔类型有效;对整数使用 && 或 || 会编译报错;
- 不要依赖短路来“隐藏”副作用——比如写成 flag && doSomething() 来条件执行,虽可行但可读性差,建议用 if 语句更清晰;
- 多个短路运算连用时,按从左到右顺序逐个判断,例如 a && b && c:a 为 false 就停,a 为 true 再看 b,b 为 false 就停,依此类推。


















