&&专用于布尔判断且具短路特性,&根据操作数类型区分逻辑与(两边boolean)或按位与(含整数),误用会导致空指针、逻辑错误或性能问题。

Java 中 && 和 & 看似都表示“与”,但本质不同:前者专用于布尔判断,带短路特性;后者是二进制位操作,无条件执行两边。用错会导致逻辑错误、空指针异常或性能浪费。
看操作数类型——这是最直接的判断依据
Java 编译器会根据操作数类型决定 & 是“逻辑与”还是“按位与”:
- 如果两边都是 boolean 表达式(比如
a > 0 & b != null),&就是逻辑与(非短路) - 如果任意一边是 整数类型(
int、byte等),&就是按位与,比如5 & 3→ 计算二进制0101 & 0011 = 0001→ 结果为1 -
&&**只接受 boolean 操作数**,写成5 && 3会编译报错
看是否需要短路——决定要不要执行右侧表达式
短路意味着“结果已确定,右侧不执行”。这在涉及方法调用、对象访问或副作用时尤为关键:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
&&:安全常见,比如obj != null && obj.isValid()—— 若obj为null,isValid()不会被调用,避免空指针 - 用
&(逻辑版):强制执行两边,比如checkPermission() & logAccess()—— 即使权限检查失败,日志仍会记录,适合需确保副作用发生的场景 - 误用
&替代&&:如str != null & str.length() > 0,当str为null时会抛NullPointerException
看使用场景——别把位运算当逻辑用
按位与 & 的典型用途和逻辑完全无关:
- 检查标志位:比如权限掩码
if ((flags & READ_PERMISSION) == READ_PERMISSION) - 清零特定位:如
value & 0xFF只保留低 8 位 - 奇偶判断:
n & 1为1表示奇数,比n % 2 == 1更高效 - 切记:不要用
5 & 3 == 1来表达“5 和 3 都为真”,那是逻辑混淆——整数非零不等于布尔true,Java 不自动转换
一个快速自查口诀
写完 & 或 && 后,问自己三个问题:
- 两边是不是都是布尔表达式?→ 是,考虑用
&&(除非明确要执行右边) - 有没有整数参与?→ 有,那
&一定是按位运算,别想逻辑 - 右边有没有副作用(如方法调用、修改状态)?→ 有,且必须执行,才选
&;否则优先&&
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










