Java 提供豐富的運算符,但細節決定成敗:整數除法截斷、位運算符號位處理、短路邏輯副作用、自增自減前後綴差異。本文系統整理六大類運算符,附帶真值表、代碼陷阱與最佳實踐。
| 運算符 | 名稱 | 示例 (A=10, B=20) | 結果 | 備註 |
|---|---|---|---|---|
| + | 正號 | +A | 10 | 無實際作用 |
| - | 負號 | -B | -20 | 取反 |
| + | 加法 | A + B | 30 | 字符串連接時重載 |
| - | 減法 | A - B | -10 | |
| * | 乘法 | A * B | 200 | |
| / | 除法 | B / A | 2 | 整數除法截斷小數位 |
| % | 取模 | B % A | 0 | 結果符號與被除數同號 |
陷阱:int c = 5 / 2; // c = 2, 非 2.5。需浮點數除法至少一操作數為浮點型:5 / 2.0。
假設 A = 60 (0011 1100), B = 13 (0000 1101)
| 運算符 | 名稱 | 規則 | 示例 | 結果 (十進制) |
|---|---|---|---|---|
| ~ | 按位非 | 0→1, 1→0 | ~A | 195 (1100 0011) |
| & | 按位與 | 同為 1 則 1 | A & B | 12 (0000 1100) |
| | | 按位或 | 至少一 1 則 1 | A | B | 61 (0011 1101) |
| ^ | 按位異或 | 不同則 1 | A ^ B | 49 (0011 0001) |
| << | 左移 | 低位補 0,高位丟棄 | A << 2 | 240 (1111 0000) ≈ ×4 |
| >> | 右移(算術) | 高位補符號位 | A >> 2 | 15 (0000 1111) ≈ ÷4 |
| >>> | 無符號右移 | 高位補 0 | A >>> 2 | 15 (正數同右移),負數變正 |
核心規律:
• 左移 n 位 ≈ 乘 2ⁿ (無溢出時)
• 算術右移 n 位 ≈ 除 2ⁿ (保留符號)
• 無符號右移將負數轉為大正數
• ^ 可用於不借助臨時變量交換兩數:a ^= b; b ^= a; a ^= b;
String,另一操作數自動轉字符串(調用 toString(),null 變 "null")。"abc" + 123 → "abc123"StringBuilder.append()。StringBuilder,避免隱式創建大量中間對象。| 運算符 | 含義 | 示例 (A=10, B=20) |
|---|---|---|
| == | 等於 | false |
| != | 不等於 | true |
| > | 大於 | false |
| >= | 大於等於 | false |
| < | 小於 | true |
| <= | 小於等於 | true |
注意:對象比較 == 比較引用地址,內容比較必用 equals()。
| 運算符 | 名稱 | 規則 | 示例 (A=true, B=false) |
|---|---|---|---|
| ! | 邏輯非 | 取反 | !B → true |
| & | 邏輯與 | 全真才真 | A & B → false |
| | | 邏輯或 | 全假才假 | A | B → true |
| ^ | 邏輯異或 | 相同為假,不同為真 | A ^ B → true |
| 運算符 | 名稱 | 短路規則 | 典型用途 |
|---|---|---|---|
| && | 短路與 | 左邊 false → 右邊不執行 | obj != null && obj.method() 防空指針 |
| || | 短路或 | 左邊 true → 右邊不執行 | cacheHit || loadFromDB() 避免多餘查詢 |
區別:&/| 總計算兩邊;&&/|| 可能跳過右邊(副作用不執行)。
| 運算符 | 等價寫法 | 示例 |
|---|---|---|
| = | a = b | a = 10 |
| += | a = a + b | a += 5 → 15 |
| -= | a = a - b | |
| *= | a = a * b | |
| /= | a = a / b | |
| %= | a = a % b | |
| &= | a = a & b | |
| |= | a = a | b | |
| ^= | a = a ^ b | |
| <<= | a = a << b | |
| >>= | a = a >> b | |
| >>>= | a = a >>> b |
int i = 10;
int a = i++; // a=10, i=11 (後綴:先用後增)
int b = ++i; // b=12, i=12 (前綴:先增後用)
int c = i-- + ++i; // 經典面試題:i=12 → c=12+13=25, 最後 i=12
建議:避免在複雜表達式中混用前後綴,拆分為多行可讀性更高。
1. 後綴: expr++, expr-- 2. 一元: ++expr, --expr, +expr, -expr, ~, ! 3. 乘除模: *, /, % 4. 加減: +, - 5. 移位: <<, >>, >>> 6. 關系: <, >, <=, >=, instanceof 7. 相等: ==, != 8. 位與: & 9. 位異或: ^ 10. 位或: | 11. 邏輯與: && 12. 邏輯或: || 13. 三元: ? : 14. 賦值: =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=
金律:不確定優先級時,加括號。代碼寫給人看,順便給編譯器跑。
運算符看似基礎,實則暗藏玄機。熟練掌握整數除法截斷、位移符號位、短路副作用、自增自減順序等細節,能讓你少踩無數坑,寫出更健壯、可讀、高效的 Java 代碼。