從零開始理解 Java 的算術與關係運算子【Thinking in Java筆記(2-2)】
在學習 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
值(true
或 false
)。常見的關係運算子包括:
- 等於:
==
- 不等於:
!=
- 大於:
>
- 小於:
<
- 大於等於:
>=
- 小於等於:
<=
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()
可以利用整數快取來提高效能並減少記憶體使用
在上述範例中,n1
和 n2
是兩個不同的 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,這些內容不但要看,還要「用」,才能真的學會
Comments ()