& 和 && 本质不同:& 是位运算符且不短路,&& 是逻辑运算符且短路;误用会导致空指针、逻辑跳过或编译错误,需据场景严格区分。

& 和 && 看似都能“判断真假”,但用错地方轻则逻辑错误,重则抛 NullPointerException 或算出错误结果。很多面试者栽在这两个符号上,不是记混了,就是没理解“短路”到底意味着什么。
别把 & 当 && 用:空指针风险就在眼前
常见错题写法:if (str != null & str.length() > 0)
表面看是想防空指针,但 & 不短路——哪怕 str == null,后面 str.length() 还是会执行,直接报错。
- 正确写法必须用
&&:if (str != null && str.length() > 0) - 顺序不能颠倒:
str.length() > 0 && str != null同样危险,因为左边先执行 - 同理,
||和|也一样:list != null || list.size() > 0是错的,应为list != null && list.size() > 0(注意这里是 &&,不是 ||)
别把 && 当 & 用:需要两边都执行时不能短路
当逻辑依赖“两侧都运行”时,&& 就不合适了。比如调试或副作用操作:
- 错例:
if (logAndReturnFalse() && isValid())——如果logAndReturnFalse()返回false,isValid()根本不调,日志写了但校验没做 - 正确做法:用
&强制执行两边:if (logAndReturnFalse() & isValid()) - 再比如位运算场景:
int flag = STATUS_A & STATUS_B;——这里 & 是位与,和逻辑无关,绝不能换成 &&
Integer 比较陷阱里藏着 & 的影子
很多人在 == 比较 Integer 时出错,根源其实是混淆了“值比较”和“引用比较”,而 & 在其中常被误用于绕过自动拆箱:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 错例:
Integer a = 128, b = 128; if (a == b & a.equals(b))——前面a == b为false(超出缓存范围),但 & 还是会执行equals,虽不报错却掩盖了逻辑问题 - 更安全写法:
if (Objects.equals(a, b))或显式拆箱:if (a != null && b != null && a.intValue() == b.intValue()) - 记住:数值比较优先用
.equals()或拆箱后比基本类型,别靠&“硬扛”引用差异
位运算误当逻辑用:类型不匹配就编译失败
& 作为位运算符,只接受整数类型(int、long、byte 等)。一旦对 boolean 变量用 &,看似能跑,实则危险:
立即学习“Java免费学习笔记(深入)”;
- 错例:
boolean x = true, y = false; int z = x & y;——编译失败!&不能直接对 boolean 做位运算(虽然某些老版本可能隐式转,但不可靠) - 正确逻辑运算:一律用
&&或||;真要位操作,确保操作数是整型,比如flags & MASK_BIT - 检查 IDE 警告:IntelliJ 或 Eclipse 会对 boolean 上用
&标黄提示,别忽略

















