本系列内容,主要从JDK 1.5(也称为 Java SE 5.0,代号 Tiger)开始,逐渐更新到最新版JDK版本,后续也会持续更新。
为什么选择从JDK 1.5开始,是因为它是 Java 发展史上最具革命性的版本之一,于 2004 年 9 月正式发布。它不仅大幅提升了 Java 的类型安全性、开发效率和代码可读性,还为后续十多年的 Java 生态奠定了现代编程范式的基础。
虽然今天大多数项目运行在 JDK 8(LTS)、JDK 17(LTS) 或 JDK 21(LTS) 上,但你每天写的代码中,可能混杂着跨越 20 年演进史 的语言特性——有些来自 2004 年的 JDK 1.5,有些来自 2023 年的 JDK 21。
让我们从 Tiger 的咆哮开始,一起走过 Java 的黄金二十年。
注:本系列将持续更新,直至最新 JDK 版本(当前为 JDK 26),并随 Oracle/OpenJDK 发布节奏保持同步。
JDK 1.5 引入了 7 项主要语言级增强(Language Enhancements),旨在提升开发效率、类型安全性和代码可读性。这些特性均由 JSR(Java Specification Requests)标准化,并在 javac 编译器中实现。
• JSR: JSR 14[1]
• 目的:在编译期提供强类型检查,消除强制类型转换,提升集合框架安全性。
• 语法示例:
List<String> list = new ArrayList<String>();
list.add("Hello");
String s = list.get(0); // 无需 (String) 强转• 关键价值:避免运行时 ClassCastException,使集合操作更安全、简洁。
• JSR: JSR 201[2]
• 目的:简化对数组和 Iterable 集合的遍历,避免手动管理索引或迭代器。
• 语法示例:
for (String s : stringArray) {
System.out.println(s);
}• 适用对象:数组、Collection、任何实现了 Iterable<T> 的类。
• JSR: JSR 201[2]
• 目的:自动在基本类型(如 int)与其包装类(如 Integer)之间转换。
• 示例:
List<Integer> list = new ArrayList<>();
list.add(10); // 自动装箱:int → Integer
int x = list.get(0); // 自动拆箱:Integer → int• 注意:需警惕 null 拆箱导致的 NullPointerException。
• JSR: JSR 201[2]
• 目的:提供类型安全、功能丰富的枚举常量定义方式,替代传统的 public static final int。
• 语法示例:
public enum Day { MONDAY, TUESDAY, WEDNESDAY }
Day today = Day.MONDAY;• 高级能力:可包含字段、方法、构造函数,甚至实现接口。
• JSR: JSR 201[2]
• 目的:允许方法接受可变数量的同类型参数。
• 语法:
public void printAll(String... messages) {
for (String msg : messages) {
System.out.println(msg);
}
}
printAll("A", "B", "C"); // 调用时传任意个 String• 底层实现:编译器将 ... 转换为数组。
• JSR: JSR 201[2]
• 目的:直接访问类的静态成员(方法或常量),无需前缀类名。
• 语法:
import static java.lang.Math.*;
import static java.lang.System.out;
double r = sqrt(16); // 而非 Math.sqrt(16)
out.println("Result: " + r);• 建议:谨慎使用,避免命名冲突或降低可读性。
• JSR: JSR 175[3]
• 目的:为代码元素(类、方法、字段等)添加元数据,供编译器、工具或运行时处理。
• 内置注解:
@Override:标记重写父类方法@Deprecated:标记过时 API@SuppressWarnings:抑制编译警告• 自定义注解示例:
public @interface Author {
String name();
String date();
}
@Author(name = "Alice", date = "2026-02-15")
public class MyClass { }• 影响:为后续框架(如 Spring、JUnit)奠定声明式编程基础。
java.util.concurrent 包:由 Doug Lea 主导,提供线程池、并发集合、同步工具等(虽非语言特性,但属 JDK 1.5 核心增强)。JSR 166[4]printf 风格):通过 java.util.Formatter、String.format() 和 System.out.printf() 实现。JSR 51[5]Oracle 的 JDK 1.5 Language Guide 明确将以下 7 项列为语言层面的新特性:
这七项构成了现代 Java 开发的基础语法骨架,至今仍是日常编码的核心组成部分。
正如《Effective Java》作者 Joshua Bloch 所言: “JDK 5 是 Java 历史上最重大的一次语言升级。”
[1] JSR 14: http://jcp.org/en/jsr/detail?id=14
[2] JSR 201: http://jcp.org/en/jsr/detail?id=201
[3] JSR 175: http://jcp.org/en/jsr/detail?id=175
[4] JSR 166: http://jcp.org/en/jsr/detail?id=166
[5] JSR 51: http://jcp.org/en/jsr/detail?id=51