&&是短路逻辑与,用于布尔条件判断;&是按位与,用于整数运算或非短路布尔运算。前者左假则跳过右表达式,后者始终执行两边,误用会导致空指针或权限失效。

Java 中 & 和 && 看似都表示“并且”,但用错一个,轻则多执行一次副作用代码,重则权限判断失效、空指针不报错还走通逻辑——问题就出在:它们根本不是同一类操作。
看操作对象:布尔值 vs 二进制位
这是最根本的区分点:
-
&& 只接受布尔类型(
boolean),只关心“真或假”。它不看数字、不拆二进制,纯粹做逻辑判断。 -
& 作为按位运算符时,操作的是整数(
int、byte等),把两个数转成 32 位二进制,然后逐位计算。比如5 & 3是0101 & 0011 = 0001,结果是1,和真假无关。 - 特别注意:& 在 Java 中是“重载”的——当两边都是
boolean时,它也能当“非短路逻辑与”用;但绝大多数业务场景中,你写boolean a & boolean b并不推荐,应优先用&&。
看执行行为:是否跳过右侧表达式
这是实际编码中最容易踩坑的地方:
-
&& 有“短路”特性:左边为
false,右边整个不执行。 例:if (obj != null && obj.getName().length() > 0)—— 安全,obj为null时不会调用getName()。 -
& 没有短路:左右两边**一定都会执行**,无论左边结果如何。
例:
if (obj != null & obj.getName().length() > 0)—— 危险!即使obj是null,也会触发getName(),直接抛NullPointerException。
看典型使用场景
别凭感觉选,按用途对号入座:
- 做条件判断(if/while)、流程控制、空安全检查 → 无条件选 &&。
- 处理权限标志、状态掩码、底层协议解析 → 用 &(此时操作数是整数)。
例:用户角色是“管理员”(假设常量
ROLE_ADMIN = 1 即 4),判断:<code>if ((userFlags & ROLE_ADMIN) != 0)—— 这里&是必须的,它在比特层面做筛选。 - 极少数需要强制执行两边布尔表达式(比如两边都有日志或计数副作用)→ 才考虑用 &,但应加注释说明意图,否则极易被后续维护者误改。
一个快速自查口诀
写完 & 或 &&,问自己三个问题:
- 两边是不是都是
boolean?→ 是,大概率该用&&。 - 右边有没有可能抛异常、改状态、耗资源?→ 是,必须用
&&防止误执行。 - 左边或右边是不是整数(如
status & ENABLED_MASK)?→ 是,只能用&,且不能替换成&&(编译不过)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











