&&、&、||、| 是 Java 條件判斷的四大基石。本文聚焦 & 與 && 的本質區別:短路求值、副作用執行、位運算屬性,並給出防空指針、避免誤增長的最佳實踐模式。
| 特性 | && (短路與) | & (邏輯與/位與) |
|---|---|---|
| 求值策略 | 左側 false 直接返回,不執行右側 | 總是執行雙側表達式 |
| 副作用 | 右側副作用可能被跳過 | 右側副作用必定執行 |
| 位運算 | 不支持 | 支持整數位運算 |
// 安全:str 為 null 時短路,不執行 equals
if (str != null && !str.equals("")) { ... }
// 危險:& 不短路,str 為 null 直接拋 NPE
if (str != null & !str.equals("")) { ... }
int i = 0;
if (2 == 1 && ++i > 0) { } // i 保持 0,右側未執行
if (2 == 1 & ++i > 0) { } // i 變為 1,右側強制執行
int flags = 0b1101; boolean hasRead = (flags & 0b0100) != 0; // 檢查第 3 位 flags |= 0b0010; // 設置第 2 位
|| vs ||| 短路或:左真則右不執行。| 邏輯或/位或:雙側必執行,可用於位掩碼合併。&&/||)**,兼顧性能與安全。&/| 並添加註釋。&/|/^/~**,語義明確。搞清這對「雙胞胎」,能消除一大類難以復現的邏輯 Bug,也是面試高頻考點。