Java 5.0 (J2SE 1.5) 是 Java 語言發展史上劃時代的版本,引入了泛型、自動裝箱/拆箱、註解、枚舉類型、靜態導入、可變參數、foreach 迴圈等重大語法特性,極大提升開發效率與代碼安全性。本文系統梳理核心新特性語法與實戰範例。
基本類型與包裝類自動轉換,編譯器隱式插入轉換代碼 (位元碼層面仍為手動調用)。
// 過去
int i = 1;
Integer iObj = new Integer(i);
int j = iObj.intValue();
// Java 5.0
int i = 1;
Integer iObj = i; // 自動裝箱
int j = iObj; // 自動拆箱
// 集合操作更簡潔
List list = new ArrayList<>();
list.add(1); // 自動裝箱
int val = list.get(0); // 自動拆箱
注意:頻繁裝箱/拆箱在高效能循環中可能產生臨時物件壓力,熱點路徑建議仍使用基本類型陣列或專用庫 (如 Trove)。
提供編譯期型別安全,消除強制轉型,實現參數化類型 (類似 C++ 模板,但採用類型擦除實現)。
// 過去:無型別約束,取出需轉型
Map map = new HashMap();
map.put("key", "value");
String s = (String) map.get("key"); // 運行時風險
// Java 5.0:編譯期強制型別檢查
Map map = new HashMap<>();
map.put("key", "value");
String s = map.get("key"); // 無需轉型,型別安全
// 配合自動裝箱
Map map = new HashMap<>();
map.put(1, "one"); // int 自動裝箱為 Integer
核心優勢:編譯期發現型別錯誤、API 文檔化、消除 ClassCastException 風險。
元程式設計基石,取代 XDoclet/Javadoc 標籤,提供標準化元資料機制。註解本質是繼承 java.lang.annotation.Annotation 的介面,Class 檔案標記 ACC_ANNOTATION。
// JDK 1.4 風格 (Javadoc 標籤)
/**
* @todo to be implemented
**/
void gimmeSomeLoving() { throw new Exception("not implemented"); }
// JDK 5.0 註解
@Todo
void gimmeSomeLoving() { throw new Exception("not implemented"); }
// 內建註解範例
@Override
public String toString() { return "safe"; }
@SuppressWarnings("unchecked")
void legacyCall() { /* 抑制非受檢警告 */ }
@Deprecated
void oldMethod() { /* 標記棄用 */ }
應用場景:框架配置 (Spring/EJB 3.0/JPA)、編譯期檢查、代碼生成、測試標記 (JUnit 4 @Test)、AOP 切點定義等。
類型安全的常量集合,編譯為擁有 ACC_ENUM 標記的 final 類,實例為單例,天然支援 switch、可實現介面、擁有方法屬性。
// 過去:int 常量模式,無型別安全
class JavaTech {
public static final int J2ME = 1;
public static final int J2SE = 2;
public static final int J2EE = 3;
}
// Java 5.0 枚舉
public enum JavaTech {
J2ME, J2SE, J2EE;
}
// 進階:帶屬性與方法
public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6);
private final double mass, radius;
Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
public double surfaceGravity() { return G * mass / (radius * radius); }
}
優勢:型別安全、名稱空間隔離、可序列化、支援 switch、可實現介面、防止實例化攻擊。
新增 java.util.Scanner 簡化文本解析,System.out.printf/String.format 提供 C 風格格式化輸出。
import java.util.Scanner;
import java.io.*;
public class TestRead {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入一句字串: ");
String str = scanner.nextLine();
System.out.println("您輸入: " + str);
// 格式化輸出
System.out.printf("長度: %d, 大寫: %s%n", str.length(), str.toUpperCase());
}
}
Scanner 優勢:支援正則分隔符、基本類型直接解析 (nextInt()、nextDouble())、文件/流/字串統一掃描源。
import static java.lang.Math.*; 直接使用 sin()、PI。void printAll(String... msgs) 內部為陣列。for (String s : list) 適用 Iterable/陣列。public class 哈囉世界)。Java API 以類為單位組織為包,透過 JCP (Java Community Process) 開放式治理,IBM/BEA 等廠商參與演進。2004 年開源提議遭 Sun 拒絕,2006 年 Sun 宣佈 OpenJDK 開源計畫 (GPL)。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
// Unicode 類名合法範例
public class 哈囉世界 {
private String 文本 = "哈囉世界";
}