if 語句是程序流程控制的基石。正確理解基本類型與引用類型的比較差異,掌握 equals、instanceof 等關鍵操作,是寫出無 Bug 代碼的前提。
int number = 1;
if (number == 1) { ... } // 相等
if (number < 2) { ... } // 小於
if (number >= 0) { ... } // 大於等於
if (number != 0) { ... } // 不等於
// 包裝類型 JDK5+ 支持 == 自動拆箱
Integer number2 = new Integer(1);
if (number2 == 1) { ... } // 自動拆箱比較值
if (number2.equals(1)) { ... } // 通用安全方式
| 類型 | == 比較 | equals 比較 | 推薦方式 |
|---|---|---|---|
| String | 比較引用地址 | 比較字符內容 | 永遠用 equals |
| 包裝類 | 比較引用(-128~127 緩存除外) | 比較值 | 用 equals |
| 自定義對象 | 比較引用地址 | 取決於重寫邏輯 | 重寫 equals 後用 equals |
String str = new String("java2000");
// ❌ 錯誤:比較引用
if (str == "java2000") { ... }
// ✅ 正確:內容比較
if (str.equals("java2000")) { ... }
// ✅ 更安全:常量在前防 NPE
if ("java2000".equals(str)) { ... }
// ✅ Java 7+ 支持 switch
switch (str) {
case "java2000": ... break;
}
if (str instanceof String) { ... } // true
Object obj = str;
if (!(obj instanceof Integer)) { ... } // true
// 模式匹配
if (obj instanceof String s) {
System.out.println(s.length()); // 直接使用 s
}
// ✅ 推薦:else-if 鏈
if (condition1) {
// ...
} else if (condition2) {
// ...
} else {
// 默認處理
}
// ❌ 避免:多個獨立 if(邏輯互斥時)
if (condition1) { ... }
if (condition2) { ... } // 仍會判斷
"const".equals(var) 而非 var.equals("const")Objects.equals(a, b) 內部處理 nullOptional.ofNullable(obj).ifPresent(...)