從零開始理解 Java 的算術與關係運算子【Thinking in Java筆記(2-2)】

從零開始理解 Java 的算術與關係運算子【Thinking in Java筆記(2-2)】
Photo by orbtal media / Unsplash

在學習 Java 的過程中,運算子(operator)是不可忽視的基礎概念。你可以把它想成程式語言的數學工具箱,能幫你完成從基本運算到條件判斷的所有工作。本文針對 Java 初學者,從最基本的算術運算開始,逐步深入解釋一元運算子、自動遞增與遞減、關係運算子,並透過清楚範例協助理解,讓你不只是會用,還真的懂它在幹嘛

算術運算子(Mathematical Operators)

Java 的算術運算子與大多數程式語言,特別是 C/C++,基本一致,包括加(+)、減(-)、乘(*)、除(/)和取餘(%)等。

以下是一個示範如何使用這些運算子的範例:

public class MathOps {
  public static void main(String[] args) {
    Random rand = new Random(47); // 創建一個隨機數生成器
    int i, j, k;
    // 從 1 到 100 隨機選取數值:
    j = rand.nextInt(100) + 1;
    System.out.println("j : " + j);
    k = rand.nextInt(100) + 1;
    System.out.println("k : " + k);
    i = j + k;
    System.out.println("j + k : " + i);
    i = j - k;
    System.out.println("j - k : " + i);
    i = k / j;
    System.out.println("k / j : " + i);
    i = k * j;
    System.out.println("k * j : " + i);
    i = k % j;
    System.out.println("k % j : " + i);
    j %= k;
    System.out.println("j %= k : " + j);

    // 浮點數運算測試:
    float u, v, w; // 適用於 double 型別
    v = rand.nextFloat();
    System.out.println("v : " + v);
    w = rand.nextFloat();
    System.out.println("w : " + w);
    u = v + w;
    System.out.println("v + w : " + u);
    u = v - w;
    System.out.println("v - w : " + u);
    u = v * w;
    System.out.println("v * w : " + u);
    u = v / w;
    System.out.println("v / w : " + u);

    // 以下運算也適用於 char、byte、short、int、long 和 double:
    u += v;
    System.out.println("u += v : " + u);
    u -= v;
    System.out.println("u -= v : " + u);
    u *= v;
    System.out.println("u *= v : " + u);
    u /= v;
    System.out.println("u /= v : " + u);
  }
}
/* 輸出:
j : 59
k : 56
j + k : 115
j - k : 3
k / j : 0
k * j : 3304
k % j : 56
j %= k : 3
v : 0.5309454
w : 0.0534122
v + w : 0.5843576
v - w : 0.47753322
v * w : 0.028358962
v / w : 9.940527
u += v : 10.471473
u -= v : 9.940527
u *= v : 5.2778773
u /= v : 9.940527
*/
補充: + 也可以用來串接字串(例如:"Hello " + "World" 會得到 "Hello World"

一元運算子 (Unary Plus and Minus)

一元運算子是只對單一變數作用的運算子

  • -a:將 a 的正負號反轉
  • +a:不改變數值,但會將 byte/short 提升為 int,避免運算錯誤
int x, a = 5, b = -3;
x = -a;        // x 的值為 -5
x = a * -b;    // x 的值為 -15
x = a * (-b);  // x 的值同樣為 -15

自動遞增與遞減(Auto Increment and Decrement)

Java 提供 ++-- 作為快速的加減 1 操作:

  • a++ 等價於 a = a + 1
  • a-- 等價於 a = a - 1

根據運算子的位置,分為:

  • 前置遞增(++i:先對變數進行遞增,再使用變數的值
  • 後置遞增(i++:先使用變數的值,再對變數進行遞增
public class AutoInc {
  public static void main(String[] args) {
    int i = 1;
    System.out.println("i : " + i);
    System.out.println("++i : " + ++i); // 前置遞增
    System.out.println("i++ : " + i++); // 後置遞增
    System.out.println("i : " + i);
    System.out.println("--i : " + --i); // 前置遞減
    System.out.println("i-- : " + i--); // 後置遞減
    System.out.println("i : " + i);
  }
}
/* 輸出:
i : 1
++i : 2
i++ : 2
i : 3
--i : 2
i-- : 2
i : 1
*/
++-- 是除了指定運算子(=)以外,唯一具有「副作用」的運算子,會改變運算元的值,而不僅僅是使用其值

關係運算子(Relational Operators)

關係運算子用於比較兩個運算元,並返回一個 boolean 值(truefalse)。常見的關係運算子包括:

  • 等於:==
  • 不等於:!=
  • 大於:>
  • 小於:<
  • 大於等於:>=
  • 小於等於:<=
public class Equivalence {
  public static void main(String[] args) {
    Integer n1 = Integer.valueOf(47);
    Integer n2 = Integer.valueOf(47);
    System.out.println(n1 == n2);      // 比較參考
    System.out.println(n1 != n2);      // 比較參考
  }
}
/* 輸出:
false
true
*/
提示: 從 Java 9 開始,建議使用 Integer.valueOf(47) 來取代 new Integer(47),因為 Integer.valueOf() 可以利用整數快取來提高效能並減少記憶體使用

在上述範例中,n1n2 是兩個不同的 Integer 物件,使用 ==!= 比較時,實際上比較的是兩個物件的參考,而不是它們的值

為了正確比較兩個物件的值,應該使用 equals() 方法:

public class EqualsMethod {
  public static void main(String[] args) {
    Integer n1 = Integer.valueOf(47);
    Integer n2 = Integer.valueOf(47);
    System.out.println(n1.equals(n2));  // 比較值
  }
}
/* 輸出:
true
*/

對於自訂的類別,如果沒有覆寫 equals() 方法,則 equals() 的預設行為仍然是比較物件的參考,而非內容。

class Value {
  int i;
}

public class EqualsMethod2 {
  public static void main(String[] args) {
    Value v1 = new Value();
    Value v2 = new Value();
    v1.i = v2.i = 100;
    System.out.println(v1.equals(v2));  // 預設比較參考
  }
}
/* 輸出:
false
*/

要讓自訂類別的 equals() 方法比較內容,需要在類別中覆寫 equals() 方法


結論

理解 Java 的基本運算子,是每個開發者都必經的過程。它不只幫你算數字,更影響整體邏輯與判斷式的正確性。本文從整數與浮點運算、一元運算子、自動遞增到關係比較,一步步為你建立穩固基礎。如果你正在學 Java,這些內容不但要看,還要「用」,才能真的學會