&是逻辑与兼按位运算符,无短路特性,两侧必执行;&&是短路与,左假则右不执行,用于安全高效条件判断;&还用于整数位运算,&&仅限布尔类型。

Java 中 & 和 && 都表示“与”,但用法和效果完全不同。选错可能引发空指针、除零异常,或白白浪费计算资源。关键不是“哪个更高级”,而是“什么场景该用哪个”。
短路与(&&):条件判断的默认选择
绝大多数 if 判断、while 条件中,应优先用 &&。它会在左侧为 false 时直接跳过右侧表达式,不执行、不求值。
- 避免运行时异常:比如
obj != null && obj.getName().length() > 0,obj 为 null 时,obj.getName()根本不会调用 - 跳过耗时操作:如
isValidUser() && loadUserProfileFromDB(),用户校验失败时,数据库查询完全省略 - 防止副作用触发:像
flag && counter++,flag 为 false 时 counter 不变
&(非短路与):只在明确需要两边都执行时才用
& 没有短路行为,左右两边一定都会被计算。这在普通条件判断里是冗余甚至危险的,但它有不可替代的用途:
- 强制执行副作用:例如两个方法都有日志或状态更新,必须都运行 ——
logAccess() & updateHitCount() - 位运算场景:当操作数是整数(int/long 等),& 是按位与,和逻辑无关,比如权限掩码检测:
userPermissions & READ_PERMISSION == READ_PERMISSION - 布尔表达式需严格求值:极少数测试或断言场景,要求所有条件都被评估以验证其行为(如单元测试中检查方法是否被调用)
性能差异其实取决于“跳过多少”
&& 的性能优势不是来自运算本身快,而是靠“不执行”。如果右侧是简单变量比较(如 a && b),差别几乎不可测;但如果右侧是数据库查询、远程调用或复杂计算,跳过一次就能节省几十毫秒甚至更久。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
list != null & list.size() > 0—— list 为 null 时抛出 NullPointerException - 正确写法:
list != null && list.size() > 0—— 安全且高效 - 混淆写法:
(x & 1) == 0—— 这里 & 是位运算,判断 x 是否为偶数,和逻辑无关,不能换成 &&
一个典型误用陷阱:混合类型别硬套
& 可用于 boolean 和整数,&& 只接受 boolean。编译器会报错帮你拦截:
-
5 & 3✅ 合法(位运算) -
5 && 3❌ 编译失败(类型不匹配) -
true & false✅ 合法(非短路逻辑与) -
true && false✅ 合法(短路逻辑与)



















