Java 運算子完整指南:類型、使用範例、優先順序、常見錯誤與最佳實踐

1. 介紹

Java 是一種高度流行的程式語言,用於各種領域,包括商業系統、網頁應用程式和 Android 應用程式開發。學習 Java 時,您將遇到的第一個基本元素之一是「運算子」。運算子是用來在程式中執行計算或比較的必要符號和規則,它們在任何 Java 程式碼庫中都頻繁出現。 許多搜尋「Java 運算子」關鍵字的人可能面臨以下問題:

  • 想要整理不同類型和意義的運算子
  • 想要看到運算子使用的具體範例
  • 想要了解運算子之間的差異和注意事項

本文系統性地解釋 Java 中使用的主要運算子,從基礎到實際應用,以清晰且適合初學者的方式涵蓋一切。它還總結了常見錯誤、重要考量和實務開發的有用提示。掌握運算子是撰寫可讀性和低錯誤程式碼的第一步。 無論您是剛開始學習 Java 還是複習基礎,本文旨在成為您遇到問題時的「首選參考」。透過範例和圖表,我們將幫助您完全理解 Java 運算子。 請閱讀至最後,鞏固您對 Java 運算子的掌握。

2. Java 運算子概覽(含快速參考表格)

Java 提供了多種用途的分類運算子。在這裡,我們整理了 Java 中使用的代表性運算子,以幫助您掌握大局。首先,讓我們看一個快速參考表格,一眼就能看到每個運算子的角色和符號。 Java 運算子快速參考表格

CategoryOperator ExamplesMain UsageSample Code
Arithmetic Operators+, -, *, /, %Numeric calculationsa + b, x % y
Assignment Operators=, +=, -=, *=, /=Assigning and updating valuesx = 5, y += 2
Comparison Operators==, !=, >, <, >=, <=Value comparisona == b, x >= y
Logical Operators&&, ||, !Logical evaluation(x > 0 && y < 10)
Bitwise Operators&, |, ^, ~, <<, >>, >>>Bit-level operationsx & y, x << 1
Increment / Decrement++, —Increase or decrease valuesi++, –j
Ternary Operator? :Conditional value switchingmax = (a > b) ? a : b
OthersinstanceofType checkingobj instanceof String

Java 運算子用於各種情境,如計算、比較和條件分支。算術、賦值、比較和邏輯運算子幾乎出現在每個程式中。 位元運算子、三元運算子和 instanceof 運算子較為進階,但學習它們能大大擴展您在 Java 中的表達能力。 在接下來的章節中,我們將解釋每個運算子類別,並提供您可以立即使用的實際範例。

3. 每個運算子類別的解釋與實際範例

Java 提供了許多不同類型的運算子。在本節中,我們將解釋每個類別的使用方式、特徵、範例和常見陷阱。請確保理解每個運算子類型的獨特行為。

3-1. 算術運算子 (+, -, *, /, %)

算術運算子用於執行數值計算。它們是加法、減法、乘法、除法和餘數計算等任務的基礎操作。

  • + (加法):將兩個數值相加。與字串一起使用時,執行串接。
  • - (減法):計算兩個數字之間的差異。
  • * (乘法):將兩個數字相乘。
  • / (除法):將左運算元除以右運算元。整數除法會捨棄小數部分。
  • % (模數):返回除法的餘數。

範例:

int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3 (decimal part is discarded)
System.out.println(a % b); // 1

注意事項:

  • int 值之間的除法會產生整數輸出(捨棄小數部分)。
  • 使用 + 運算子與字串會產生串接,而不是算術加法。

3-2. 賦值運算子 (=, +=, -=, *=, /=, %=)

賦值運算子用於設定或更新變數的值。複合賦值運算子有助於使程式碼更簡潔。

  • = (賦值):將右側的值賦值給左側的變數。
  • += (加法並賦值):將右側的值相加並重新賦值結果。
  • 其他複合運算子包括 -=*=/=%=

範例:

int x = 5;
x += 3;  // Equivalent to x = x + 3 → x becomes 8
x *= 2;  // Equivalent to x = x * 2 → x becomes 16

重點:

  • 複合賦值運算子在重複計算或迴圈操作時特別有用。

3-3. 比較運算子 (==, !=, >, <, >=, <=) 與 instanceof

比較運算子用來檢查值是否符合指定條件。

  • ==(等於):檢查兩個值是否相等。
  • !=(不等於):檢查兩個值是否不同。
  • ><>=<=:比較大小。
  • instanceof:檢查物件是否為特定類型的實例。

範例:

int a = 5, b = 7;
System.out.println(a == b); // false
System.out.println(a < b);  // true

String str = "hello";
System.out.println(str instanceof String); // true

重要說明:

  • 若要比較字串或物件的內容,請使用 equals()== 運算子比較的是參考(是否指向同一個實例)。

3-4. 邏輯運算子 (&&, ||, !)

當需要評估組合條件時使用邏輯運算子。

  • &&(AND):僅在兩個條件皆為 true 時回傳 true。
  • ||(OR):只要其中一個條件為 true 就回傳 true。
  • !(NOT):將布林值取反。

範例:

int age = 20;
boolean isMember = true;
System.out.println(age >= 18 && isMember); // true
System.out.println(!(age < 18));           // true

短路求值:

  • &&|| 會在左側條件已決定結果時,跳過右側的求值。

3-5. 位元運算子 (&, |, ^, ~, <<, >>, >>>)

位元運算子在位元層面上操作整數值,常用於系統開發或效能關鍵的處理。

  • &(AND):兩位皆為 1 時回傳 1。
  • |(OR):任一位為 1 時回傳 1。
  • ^(XOR):只有其中一位為 1 時回傳 1。
  • ~(NOT):將所有位元取反。
  • <<(左移):將位元向左移動。
  • >>(右移):有符號右移。
  • >>>(無符號右移)

範例:

int x = 5;   // 0101
int y = 3;   // 0011
System.out.println(x & y); // 1 (0001)
System.out.println(x | y); // 7 (0111)
System.out.println(x ^ y); // 6 (0110)
System.out.println(~x);    // -6
System.out.println(x << 1); // 10

3-6. 增減運算子 (++, –)

這些運算子會將變數的值增加或減少 1。前置遞增/遞減與後置遞增/遞減的行為不同。

  • ++:增加 1。
  • --:減少 1。

範例:

int i = 0;
i++; // i becomes 1
++i; // i becomes 2

前置 vs 後置:

  • ++i 先遞增,然後回傳遞增後的值。
  • i++ 先回傳目前的值,之後再遞增。

3-7. 三元運算子 (? 🙂

三元運算子允許你在單行表達式中寫出條件邏輯。

語法:

condition ? value_if_true : value_if_false

範例:

int max = (a > b) ? a : b;

小技巧:

  • 它可以簡化程式碼,但對於複雜條件請避免過度使用。

4. 運算子優先順序與結合性

當同一表達式中出現多個運算子時,Java 會依照稱為「運算子優先順序」的規則來評估。此外,當具有相同優先順序的運算子同時出現時,評估的先後順序由「結合性」決定。若誤解這些規則,程式碼可能會產生意外結果或錯誤。

4-1. 運算子優先順序表

以下表格列出主要 Java 運算子依優先順序排列。數字越小表示優先順序越高。

PrecedenceOperatorsMain UsageAssociativity
1()Grouping with parenthesesLeft to Right
2++, --, !, ~, +, -Unary operatorsRight to Left
3*, /, %Multiplication, division, remainderLeft to Right
4+, -Addition, subtractionLeft to Right
5<<, >>, >>>Shift operationsLeft to Right
6<, <=, >, >=, instanceofComparison and type checkingLeft to Right
7==, !=Equality and inequalityLeft to Right
8&Bitwise ANDLeft to Right
9^Bitwise XORLeft to Right
10|Bitwise ORLeft to Right
11&&Logical ANDLeft to Right
12||Logical ORLeft to Right
13? :Ternary (conditional) operatorRight to Left
14=, +=, -=, other assignment operatorsAssignmentRight to Left

4-2. 視覺化優先順序與結合性

考慮以下表達式:

int result = 2 + 3 * 4;

因為 *(乘法)的優先順序高於 +(加法),所以先計算乘法:

3 * 4 = 12,
接著計算 2 + 12 = 14。

4-3. 使用括號明確控制優先順序

當表達式變得複雜或你想確保清晰時,請始終使用括號 () 來明確控制運算順序。
範例:

int result = (2 + 3) * 4; // 2+3 is evaluated first → result becomes 20

4-4. 常見錯誤與重要說明

  • 錯誤的優先順序假設可能導致意外結果。
  • 範例:

    boolean flag = a > 0 && b < 10 || c == 5;
    
    • 因為 && 的優先順序高於 ||,此表達式等價於:(a > 0 && b < 10) || c == 5
    • 為避免錯誤,務必在複雜表達式中使用括號

運算子優先順序與結合性常讓初學者感到困惑,但只要了解規則,就能撰寫更可預測且可靠的 Java 程式碼。

5. 常見錯誤與常見陷阱

雖然 Java 運算子看似簡單,初學者與中階開發者常會遇到意外行為與細微錯誤。本節彙總了與運算子相關的常見實務錯誤與典型陷阱。

5-1. 整數除法的意外結果

在 Java 中對兩個 int 值相除時,結果永遠是整數——小數部分會被捨棄。

int a = 5;
int b = 2;
System.out.println(a / b); // Output: 2

如果想要得到小數結果,請將其中一個運算元轉型為 double(或 float):

System.out.println((double)a / b); // Output: 2.5

5-2. 浮點精度問題

使用 double 或 float 可能會產生細微的四捨五入誤差。

double d = 0.1 + 0.2;
System.out.println(d); // Output example: 0.30000000000000004

對於需要嚴格精確的計算(例如金融金額),請改用 BigDecimal

5-3. ==equals() 的差異

在比較物件(如字串)時,常見的錯誤是混淆 ==equals() 的差別。

  • ==:比較兩個參考是否指向同一個實例。
  • equals():比較物件的實際內容(值或文字)。
    String s1 = new String("abc");
    String s2 = new String("abc");
    
    System.out.println(s1 == s2);      // false (different instances)
    System.out.println(s1.equals(s2)); // true  (contents are identical)
    

5-4. 短路求值導致的副作用遺失

邏輯運算子 &&|| 會使用「短路求值」,即當左側已決定結果時,右側表達式會被跳過。
若未了解此行為,預期的副作用(如變數更新或方法呼叫)可能永遠不會發生。

int a = 0;
if (a != 0 && 10 / a > 1) {
    // This block is never executed
}

此例中,因為 a != 0 為 false,10 / a 表達式不會被評估,從而避免除以零的錯誤。

5-5. 缺少括號導致的邏輯錯誤

在複雜條件表達式中省略括號,常因優先順序誤解而導致錯誤的評估結果。

boolean flag = a > 0 && b < 10 || c == 5;
// Intended meaning: ((a > 0) && (b < 10)) || (c == 5)
// But depending on context, interpretation may differ

5-6. 小結

  • 始終確認資料型別(int 與 double)以及比較方式(== 與 equals)。
  • 養成在複雜表達式中使用括號的習慣。
  • 注意 Java 特有的行為,例如短路求值。

只要記住這些要點,就能大幅減少 Java 中常見的運算子相關錯誤。

6. 實作範例:運算子範例程式碼

本節介紹實務範例程式碼,說明 Java 運算子在真實開發情境中的使用方式。這些範例突顯常見的使用情境,協助加深理解並提升實作能力。

6-1. 在 if 陳述式中使用比較與邏輯運算子

在結合多個條件進行分支時,比較與邏輯運算子是必不可少的。

int age = 25;
boolean isMember = true;

if (age >= 18 && isMember) {
    System.out.println("Service is available.");
} else {
    System.out.println("Conditions not met.");
}

6-2. 在迴圈中使用遞增運算子

遞增 (++) 與遞減 (–) 運算子在迴圈處理計數器時常被使用。

for (int i = 0; i < 5; i++) {
    System.out.println("Count: " + i);
}

6-3. 使用三元運算子簡化條件賦值

三元運算子讓您在不寫完整 if 陳述式的情況下直接賦值。

int score = 75;
String result = (score >= 60) ? "Pass" : "Fail";
System.out.println(result); // Pass

6-4. 使用複合賦值運算子簡化程式碼

複合賦值運算子在重複更新變數值時非常實用。

int total = 0;
for (int n = 1; n <= 10; n++) {
    total += n; // Equivalent to total = total + n
}
System.out.println("Total: " + total);

6-5. 實用的位元運算子範例:管理旗標

位元運算在有效管理多個 ON/OFF 旗標時相當有用。

int FLAG_READ = 1;   // 0001
int FLAG_WRITE = 2;  // 0010
int FLAG_EXEC = 4;   // 0100

int permission = FLAG_READ | FLAG_WRITE; // 0011

// Check if write permission exists
if ((permission & FLAG_WRITE) != 0) {
    System.out.println("Write permission granted.");
}

6-6. 在實務情境中結合多種運算子

當條件變得複雜時,使用括號以避免歧義。

int a = 3, b = 7, c = 5;
if ((a < b && b > c) || c == 5) {
    System.out.println("Condition satisfied.");
}

6-7. 撰寫可讀程式碼的技巧

  • 將複雜的表達式拆解成較小、較易讀的部分。
  • 使用括號明確說明運算順序。
  • 為變數命名並撰寫能清楚傳達意圖的註解。

自行執行這些範例程式,能加深您對運算子的理解。當您能自由運用各種運算子時,Java 開發將變得更有效率且更有趣。

7. 小結

到目前為止,我們已涵蓋 Java 中主要的運算子——從基本概念到實務應用。運算子是程式內執行計算、評估與資料操作的基礎。正確理解與使用它們,可讓程式碼更高效且減少錯誤。

7-1. 本文回顧

  • Java 提供多種運算子類型,如算術、賦值、比較、邏輯、位元、三元、遞增/遞減,以及 instanceof,每種都有不同的用途與行為。
  • 了解 Java 特有的規則——例如運算子優先順序、結合性與短路求值——有助於避免意外的錯誤。
  • 透過實作範例(如 if 陳述式、迴圈與條件分支)來學習,可加深概念的掌握。
  • 必須留意常見錯誤,例如資料型別混淆,或在物件比較時誤用 == 而非 equals()

7-2. 學習建議

學習運算子運作最有效的方式是自行撰寫程式並執行。嘗試輸入並執行本文所介紹的範例程式,親自體驗其行為。
每當遇到疑問或不確定之處,養成查閱文件或可靠技術資源的習慣,以鞏固您的理解。
掌握 Java 運算子的基礎,將讓您在開發任何 Java 程式時更有信心。將此知識運用於持續的學習與成長中。

8. 常見問題 (FAQ)

本節涵蓋學習者與在職開發者常見的 Java 運算子問題。利用以下答案加深理解,並快速解決疑惑。

Q1. 哪個運算子用於字串串接?
A1. 使用 + 運算子進行字串串接。
例如,"Hello" + " World" 會得到 "Hello World"
當字串與數字串接時,結果會變成字串。

Q2. == 運算子與 equals() 方法有何差別?
A2.

  • == 比較兩個參考是否指向同一個物件實例。
  • equals() 比較物件內部的內容。

對於像 String 這類物件,若要比較值,請始終使用 equals()

Q3. 前置遞增 (++i) 與後置遞增 (i++) 運算子有何不同?
A3.

  • 前置遞增( ++i ):先遞增值,然後回傳更新後的值。
  • 後置遞增( i++ ):先回傳目前的值,之後再遞增。
    int i = 5;
    System.out.println(++i); // Outputs 6
    System.out.println(i++); // Outputs 6, then i becomes 7
    

Q4. 什麼是邏輯運算子的短路求值?
A4. 邏輯運算子 &&|| 會在左側已決定最終結果時,跳過右側表達式的求值。
這可避免不必要的計算,並防止可能的錯誤(例如除以零)。

Q5. 如何明確改變運算子優先順序?
A5. 使用圓括號 ()
圓括號會強制先求值括號內的部分,使複雜表達式更清晰且更安全。

int result = (2 + 3) * 4; // 2+3 is evaluated first

Q6. 在哪些情境下會使用位元運算子?
A6. 位元運算子在以下情況特別有用:

  • 標誌(Flag)管理
  • 硬體層級控制
  • 需要效能優化的計算

例如,可將多個開/關狀態有效率地儲存在單一整數中。

Q7. 我可以在 Java 中自訂運算子嗎?
A7. Java 不支援像 C++ 那樣的自訂運算子或運算子重載。
不過,你可以透過自行撰寫方法來實作等效的行為。

在持續練習的過程中,可能會產生其他問題。屆時,請參考官方文件或可信的學習資源,以深化理解。

9. 參考連結與官方外部資源

想更深入探討 Java 運算子或驗證官方規範的讀者,以下提供一系列可靠的參考與學習資源。這些連結在實務開發或研究時也相當有用。

9-1. 官方文件

9-2. 有用的外部學習資源

9-3. 想要更進一步學習的讀者

使用說明

上述連結為 2025 年 5 月止的主要學習資源與官方參考。
由於內容與 URL 未來可能變動,請定期檢查是否有最新更新。
結合本篇文章與這些資源,你可以進一步深化對 Java 運算子的理解,並提升實務開發能力。