JDK 5(Java SE 5)于 2004 年 9 月正式发布,是 JDK 1.4 之后的一次重大更新。第一个对外以「Java 5」而非「Java 1.5」命名的版本;平台品牌 J2SE → Java SE 的过渡亦在此前后。详见 Java 版本历史。
Tiger 语言特性(含注解)自 2002 年起在 JCP 并行规划(JSR 175 等于 JDK 1.4 发布后不久立项);2003 年 12 月有 Early Access 构建,2004 年 2 月公开 Beta——均早于上述正式版。
发布历程
「2004 年 9 月」指 GA(正式版);Tiger 在 JCP 与 Sun 产品线上的里程碑更早:
| 阶段 | 大约时间 | 说明 |
|---|---|---|
| JDK 1.4 GA | 2002-02 | 1.4 落地后,Tiger 语言特性(含 JSR 175 注解)即在 JCP 并行推进 |
| JSR 175 立项 | 2002-03~04 | JCP 评审通过,专家组成立 |
| JSR 175 公开评审 | 2003-11 | 注解规范草案公开 |
| Tiger Early Access | 2003-12 | 预发布 JDK(含注解等语言特性),面向早期测试 |
| Tiger 公开 Beta | 2004-02 | 可在 java.sun.com/j2se/1.5 下载试用 |
| JDK 5 Final | 2004-09-30 | 对外称 Java 5 / J2SE 5.0;java.version 仍为 1.5.0_xxx |
同一 Tiger 版本还打包了泛型(JSR 14)、枚举与增强 for(JSR 201)、JUC(JSR 166)等;整体由 JSR 176(J2SE 5.0 Release Contents)归集交付。
版本号说明
| 维度 | JDK 5 |
|---|---|
| 对外名称 | Java 5 / J2SE 5.0(旧) |
java.version |
1.5.0_xxx |
| class major version | 49 |
完整命名演变见 Java 版本历史。
概览
语言
- 泛型(Generics)
- 增强 for 循环(for-each)
- 自动装箱 / 拆箱(Autoboxing)
- 枚举类型(
enum) - 变长参数(Varargs)
- 静态导入(
import static) - 注解(Annotations / 元数据)
类库
java.util.concurrent(JUC 并发包)java.util.ScannerFormatter/printf风格格式化输出
泛型
参数化类型,编译期类型检查,减少强制类型转换(详见 Java 泛型(Generics)):
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0); // 无需 (String) 强转
JDK 7 起可用钻石操作符 <> 简化右侧类型声明(见 JDK 7)。
增强 for 循环
增强 for 循环(for-each)是语法糖:编译器对数组展开为下标循环,对 Iterable 展开为 Iterator 遍历,字节码层面与手写等价。
JDK 5 之前遍历数组需用下标访问;遍历 Collection 则依赖 Iterator(完整 1.4 写法见 JDK 1.4)。注意:泛型也是 JDK 5 才引入,JDK 1.4 不能写 List<String>,只能用 raw type 并在取出元素时强转:
// JDK 1.4:数组
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// JDK 1.4:集合(无泛型,需强转;asList 只能传数组,见下文)
List list = Arrays.asList(new String[] {"a", "b", "c"});
for (Iterator it = list.iterator(); it.hasNext(); ) {
System.out.println((String) it.next());
}
JDK 5 起支持变长参数,Arrays.asList("a", "b", "c") 才无需先构造数组。下面为 JDK 5 写法:
int[] arr = {1, 2, 3};
for (int n : arr) {
System.out.println(n);
}
List<String> list = Arrays.asList("a", "b", "c");
for (String s : list) {
System.out.println(s);
}
自动装箱与拆箱
基本类型与包装类之间自动转换:
List<Integer> list = new ArrayList<>();
list.add(42); // int → Integer
int x = list.get(0); // Integer → int
枚举
类型安全的枚举常量,可带字段与方法:
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
变长参数
方法最后一个参数可声明为变长参数,本质是语法糖,编译器按数组处理:
public class Varargs {
public static void test(String... args) {
for (String arg : args) {
System.out.println(arg);
}
}
public static void main(String[] args) {
test(); // 0 个参数
test("a"); // 1 个参数
test("a", "b"); // 多个参数
test(new String[] {"a", "b", "c"}); // 直接传数组
}
}
静态导入
导入类的静态成员,简化调用:
import static java.lang.Math.PI;
import static java.lang.Math.pow;
double area = PI * pow(r, 2);
注解
为代码附加元数据,供编译器或运行时框架读取(如 @Override、@Deprecated;JDK 5 内置注解,也可自定义;详见 Java Annotation(注解)):
@Override
public String toString() {
return "example";
}
注解成为语言特性后,框架不必再只靠 XML 描述元数据,可在启动或类加载时通过反射读取。典型例子:Spring 在 1.x 时代以 XML 配置 Bean;Spring 2.0 / 2.5(2006–2007) 起才大规模采用自定义注解(@Autowired、@Transactional、@RequestMapping 等)——这些注解本身由 Spring 用 @interface 定义,依赖的正是 JDK 5 提供的注解机制与 Java 5 基线。
java.util.concurrent
JSR 166 引入的并发工具包,包括 ExecutorService、ConcurrentHashMap、CountDownLatch、BlockingQueue 等,是后续 Java 并发编程的基础。
与其它版本
- 上一版本:JDK 1.4——assert、NIO、正则、JUL 等
- JDK 6(1.6):脚本引擎、Web Service 增强等,改动相对 JDK 5 较小
- JDK 7:JDK 7——try-with-resources、NIO.2、ForkJoin 等
- JDK 8:JDK 8——Lambda、Stream、
java.time
维护记录
| 时间 | 修改内容 | 原因 |
|---|---|---|
| 2026-06-20 | 重命名为 jdk-5-features.md;扩展为 JDK 5 全特性概览;补充版本号说明 |
整理文档;记录版本命名演变 |
| 2026-06-20 | title 改为「JDK 5 特性」 | 「新特性」仅适用于发布当期,回顾性文档用「特性」 |
| 2026-06-20 | 重命名为 jdk-5.md;title 改为「JDK 5」;url 改为 jdk-5 |
全系列统一简洁命名 |
| 2026-06-20 | 泛型章节关联 Java 泛型(Generics) | 站内已有专题文档 |
| 2026-06-20 | 增强 for 循环章节补充 JDK 1.4 对比写法 | 便于理解语法演进 |
| 2026-06-20 | 修正 JDK 1.4 集合示例:去掉泛型语法,改用 raw type + 强转 | 泛型与 for-each 同为 JDK 5 引入 |
| 2026-06-20 | JDK 1.4 集合示例改回 Arrays.asList + 数组;变长参数说明链到本文 §变长参数 |
示例更简洁,与文档内章节呼应 |
| 2026-06-20 | 增强 for 循环章节补充语法糖说明 | 与变长参数章节表述一致 |
| 2026-06-20 | 关联 JDK 1.4 | 新建 1.4 特性文档,互为引用 |
| 2026-06-20 | 版本号说明精简,链到 Java 版本历史 | 集中维护命名演变 |
| 2026-06-21 | 注解章节关联 annotation.md |
站内已有专题文档 |
| 2026-06-24 | 补充 Tiger EA/Beta 时间线;注解章节关联 Spring 采用注解的历程 | 厘清 JDK 5 预览版与框架演进关系 |
| 2026-06-24 | 新增「发布历程」表(JSR 175 / Tiger EA / Beta / GA) | 集中维护 JDK 5 预览与正式版时间线 |