JDK 1.4(J2SE 1.4)于 2002 年 2 月发布。对外称 Java 2 Platform, Standard Edition 1.4;命名体系与后续演变见 Java 版本历史。
1.4 GA 后,下一代 Tiger(JDK 5) 的语言特性即在 JCP 并行规划——含 JSR 175 注解(2002 年 3 月立项),并非等 1.4 维护多年后才起步。详见 JDK 5 §发布历程。
注意:jdk14.md 记录的是 JDK 14(2020),与本文的 JDK 1.4 不是同一版本。
版本号说明
| 维度 | JDK 1.4 |
|---|---|
| 平台品牌 | J2SE 1.4 |
java.version |
1.4.2_19 等 |
| class major version | 48 |
| 下一版本 | JDK 5 |
完整命名演变见 Java 版本历史。
概览
语言
assert断言(-source 1.4编译,运行时-ea开启)
类库
java.util.regex正则表达式(详见 分组与捕获)- NIO(
java.nio):Buffer、Channel、Selector、内存映射文件 java.util.logging(JUL,Java 原生日志,见 commons-logging 与 log4j、jcl-over-slf4j)java.util.prefsPreferences API(用户/系统配置持久化)- URI 与 URL 区分(
java.net.URI) - 链式异常(
Throwable.initCause()) - Image I/O、Java Web Start、Sound API 等
JVM 与性能
- HotSpot 成为唯一 VM(1.4.0 起移除 Classic VM;HotSpot 自 JDK 1.3 起已是默认实现,见 HotSpot)
- Parallel Scavenge 新生代收集器(1.4.0);1.4.1 起 GC 调优选项增强(见 Java GC)
- 1.4.2 引入自旋锁(
-XX:+UseSpinning,见 Java Lock)
工具与诊断
- JPDA(Java Platform Debugger Architecture)架构完善
assert 断言
JDK 1.4 在语言层新增 assert 关键字,用于开发/测试阶段的条件检查;默认关闭,生产环境通常不启用。语法、-ea / -da 运行参数及设计取舍详见 Java assertion。
assert value >= 0 : "value must be non-negative: " + value;
编译需 -source 1.4;老版本 JDK 无法识别 assert 关键字。
正则表达式(java.util.regex)
JDK 1.4 之前 Java 无标准正则 API,需依赖第三方库。1.4 起内置 Pattern / Matcher:
Pattern p = Pattern.compile("[A-Z0-9]{10}");
boolean ok = p.matcher("ABC1234567").matches();
入门与常用语法见 Java 正则表达式。
NIO(New I/O)
java.nio 提供面向 Buffer / Channel 的 I/O 模型,支持非阻塞 I/O 与多路复用(Selector),是对传统 InputStream / OutputStream 的补充。
| 组件 | 作用 |
|---|---|
Buffer |
内存缓冲区(ByteBuffer 等) |
Channel |
与 Buffer 配合的 I/O 通道 |
Selector |
多路复用,支撑 NIO 服务器 |
MappedByteBuffer |
内存映射文件,可替代部分 RandomAccessFile 场景 |
NIO 文件路径 API(java.nio.file)要到 JDK 7 才引入(NIO.2)。
java.util.logging
JDK 1.4 内置 JUL(Java Util Logging),提供标准日志 API。许多项目后来选用 Log4j、SLF4J 等;与 JUL 的桥接、选型讨论见 commons-logging 与 log4j。
Logger logger = Logger.getLogger("com.example");
logger.info("hello");
URI 与 URL
JDK 1.4 起 java.net.URI 与 URL 职责分离:URI 表语法结构,URL 是含定位信息的 URI 特例。详见 Java URL URI。
链式异常
异常可通过 initCause() 关联根因,改善早期 Java 异常栈信息不足的问题:
try {
// ...
} catch (IOException ex) {
throw new RuntimeException("read failed", ex); // JDK 1.4 起支持 cause 链
}
与 JDK 5 的衔接
JDK 1.4 尚无泛型、增强 for 循环、自动装箱、enum、变长参数等语法——这些均在 JDK 5 引入。JDK 5 文档中的 JDK 1.4 对比示例(下标 for、Iterator + raw type)可作为理解语法演进的参考。
GC 组合速查
JDK 1.4 先后引入了 Parallel Scavenge(1.4.0)和 CMS、ParNew(1.4.2,均为实验特性),到 1.4 系列结束时,可用的新生代 + 老年代组合如下(详见 Java GC):
| 新生代收集器 | 老年代收集器 | 启用参数 | 说明 |
|---|---|---|---|
| Serial | Serial Old | -XX:+UseSerialGC |
自 JDK 1.3.1 及以前就是唯一选择,1.4 中仍可用 |
| Parallel Scavenge | Serial Old | -XX:+UseParallelGC |
1.4.0 引入;此时 Parallel Old 还未出现(JDK 1.6 才有),且 Parallel Scavenge 无法与 CMS 配合,老年代只能选 Serial Old |
| ParNew | CMS | -XX:+UseParNewGC 搭配 -XX:+UseConcMarkSweepGC |
1.4.2 随 CMS 一起以实验特性引入;ParNew 是 Serial 的多线程版本,存在的主要目的就是配合 CMS 收集新生代 |
| ParNew | Serial Old(后备) | (Concurrent Mode Failure 时自动切换) | 非正常配置,是 CMS 并发失败时的后备预案,停顿时间会明显变长 |
ParNew 是新生代收集器,本身不属于 CMS 的一部分;但因为 Parallel Scavenge 无法与 CMS 搭配,ParNew 事实上是当时唯一能配合 CMS 工作的并行新生代收集器,所以两者常被一起提及。
参考
维护记录
| 时间 | 修改内容 | 原因 |
|---|---|---|
| 2026-06-21 | 修正 HotSpot 表述:1.3 默认、1.4 移除 Classic VM | 与 hotspot.md、java-version-history 对齐 |
| 2026-06-24 | 首段补充 Tiger / JSR 175 与 1.4 的时间衔接;链到 jdk-5.md | 厘清 1.4 与 JDK 5 规划并行关系 |
| 2026-06-24 | 首段补充 Tiger / JSR 175 与 1.4 的衔接;链到 jdk-5.md | 厘清 1.4 与 JDK 5 规划时间线 |
| 2026-07-14 | 新增「GC 组合速查」章节,补充可用新生代/老年代收集器组合表格 | 说明 ParNew 作为新生代收集器的配套老年代收集器 |
| 2026-07-15 | url 改为 jdk-1-4 |
URL 含 . 时 Cloudflare 误判 MIME,页面无法打开 |