大家好!欢迎来到程序视点,我是你们的老朋友.安戈👋
前两天有个读者私信我,语气挺委屈的:
「安戈,面试官问我 JDK 8 有什么新特性,我憋了半天,就说出个 Lambda……」
我回他:「Lambda 已经不错了,至少你没说 System.out.println。」
他沉默了三秒,又补了一句:「我们项目已经上 JDK 17 了,代码里 var、record 满天飞,我看得懂语法,但不知道这些玩意儿从哪冒出来的。」
说实话,看到这条消息,我挺有共鸣的。学 Java 的时候,谁没被版本号折磨过?JDK 1.8、Java 8、J2SE、J2EE……书上写的、同事说的、面试问的,经常对不上号。
今天这篇,不堆概念、不卖课,就是把我这些年踩过的坑、查过的资料,用大白话给你捋一遍——Java 这 30 年,到底经历了什么,你现在该关注哪些版本。

别急着记版本号,先把「家族关系」搞清楚。

你可以这么理解:
Java 语言:老祖宗,定规矩、写语法。
JVM:翻译官,Windows、Mac、Linux 都能听懂 Java 的话。
JRE:翻译官单人套餐,能跑程序就行。
JDK:豪华全家桶,编译、调试、开发工具全都有。
写代码用 JDK,跑程序靠 JRE,跨平台靠 JVM。这三者的关系搞明白了,后面看版本演进才不会晕。
有人觉得:「会写代码就行了,历史有什么用?」
还真有用。举几个真实场景:
面试问「JDK 8 核心新特性」,你只会背 Lambda,面试官追问 Stream、Optional,你就卡壳了。
项目用 JDK 17,同事说「这个 Switch 表达式 JDK 13 就有了」,你完全不知道人家在说什么。
技术选型时,有人提议上 JDK 21,有人坚持 JDK 8,你连个判断依据都没有。
懂历史,不是背年号,是看懂「为什么这样演进」——每个新特性,都是在解决上一代的痛点。
1991 年,Sun 公司有个叫 Green 的项目,想给智能家电写通用控制系统。语言最初叫 Oak(橡树),后来商标撞车,团队想起常去的一家咖啡店叫 Java——于是,Java 这个名字和咖啡 Logo 就定下来了。
1996 年 1 月 23 日,JDK 1.0 发布,一句口号响彻全球:
「Write Once, Run Anywhere」 一次编写,到处运行。
同一份代码,不用改,就能在 Windows、Mac、Linux 上跑。那时候 Applet 让网页「动」起来,Java 火遍大江南北。基础语法、多线程、垃圾回收、AWT 图形界面,都在这个版本里扎了根。
野蛮生长:JDK 1.x 打地基 JDK 1.1(1997):企业级起步 JDBC 登场——Java 能标准化连数据库了。没有它,Java 想在企业后端当大哥,门都没有。还有内部类、反射、RMI,都是后来高频用到的能力。

Sun 把 Java 拆成三块:
集合框架(List、Set、Map)、JIT 编译器、Swing,都在这个版本。HotSpot 虚拟机也在这时候引入,后来成了性能优化的里程碑。
JDK 1.3:HotSpot 成默认 JVM,性能明显提升。 JDK 1.4:NIO(非阻塞 I/O)、正则表达式、断言——高性能网络编程的基石。 JDK 5:Java 的「成人礼」
从 JDK 5 开始,命名规则变了:不再叫 JDK 1.5,直接叫 JDK 5。
JDK 5这个版本的新特性,多到可以单独写一篇:
记不住?记个口诀:
「泛强自枚注可静」——泛型、增强 for、自动装箱、枚举、注解、可变参数、静态导入。
JDK 6 主打性能优化和易用性:脚本语言支持、JDBC 4.0、G1 垃圾回收器(实验性)等。
JDK 7 原计划有大动作(Lambda),因 Sun 被 Oracle 收购而推迟,但几个实用特性留下了:
JDK 8 是迄今为止影响最深远的版本,没有之一。
哪怕你现在用 JDK 17、JDK 21,每天写的代码里,处处是 JDK 8 的影子。
匿名内部类啰嗦?Lambda 一行搞定:
// 之前
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
// JDK 8
Runnable r = () -> System.out.println("Hello");
集合处理像写 SQL,声明式、链式调用:
List<String> filtered = list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
接口里可以写带方法体的默认实现了,向后兼容老代码。
LocalDate、LocalDateTime 终于告别难用的 Date 和 Calendar。
优雅处理空指针,Optional.ofNullable(getName()).ifPresent(...) 比一堆 if (obj != null) 清爽。
###为什么企业爱 JDK 8?
语法革命 + 生态依赖 + 思维转变——Lambda 和 Stream 改变了写 Java 的方式,Spring Boot 2.x 等框架长期基于它,统治企业开发超过十年。
JDK 9:模块化系统(Project Jigsaw),把庞大的 JDK 拆成模块,按需打包;还有 JShell、集合工厂方法 List.of() 等。
JDK 10:var 局部变量类型推断——var name = "Java",类型自动推断。
JDK 11:继 JDK 8 之后第一个被广泛采用的 LTS(长期支持) 版本。标准化 HttpClient、单文件直接运行 java Hello.java、实验性 ZGC 低延迟 GC,还移除了 Java EE 和 CORBA 等历史包袱。
从 JDK 12 起,Java 引入预览特性机制:新特性先预览,根据反馈再定稿,需要 --enable-preview 才能用。
几个高频特性:
int days = switch (month) { case JAN -> 31; ... }
多行字符串用 """ 包起来,写 JSON、HTML 不再拼接。
public record Person(String name, int age) {} 一行替代 getter、equals、hashCode、toString。
限制类的继承关系,设计更清晰。 JDK 17 是第三个 LTS,Spring Boot 3.x 要求 JDK 17+,现代 Java 的新标配。
JDK 21(2023)是第四个 LTS,虚拟线程(Virtual Threads) 正式发布——可以在一个应用里轻松创建百万级并发线程,资源消耗极低:
// 传统线程
Thread thread = new Thread(() -> doWork());
thread.start();
// JDK 21 虚拟线程
Thread.startVirtualThread(() -> doWork());
高并发编程的门槛,被 JDK 21 砸平了一截。还有结构化并发、顺序集合接口等,都在往「更好写、更安全」的方向走。
JDK 1.8 = JDK 8 = Java 8,同一个东西,不同叫法。
J2SE 8 这种老说法,JDK 5 之后就翻篇了,现在叫 Java SE。
LTS 版本:企业项目认准 LTS——JDK 8(免费官方更新已停)、JDK 11(支持至 2026)、JDK 17(支持至 2029)、JDK 21(支持至 2031,新项目强烈推荐)。
学 Java 先学好 SE。
:JDK 8 有哪些核心新特性?
A:Lambda 表达式、Stream API、接口默认方法、新日期时间 API(java.time)、Optional。能展开讲一两个使用场景,加分。
Q:为什么 JDK 8 影响这么大?
A:三点——语法革命(Lambda/Stream 改变写法)、生态依赖(框架长期基于它)、思维转变(从命令式走向声明式、函数式)。
一张表,30 年脉络
阶段 | 版本 | 核心意义 |
|---|---|---|
诞生 | JDK 1.0 | 跨平台,Applet 时代 |
成长 | JDK 1.2-1.4 | 集合框架、NIO、JIT |
革命 | JDK 5 | 泛型、注解、for-each |
企业 | JDK 6-7 | 企业级特性,性能优化 |
现代 | JDK 8 | Lambda、Stream、函数式 |
模块化 | JDK 9-11 | 模块系统、HttpClient、var |
成熟 | JDK 12-17 | Switch 表达式、Records、密封类 |
并发 | JDK 18-21 | 虚拟线程、结构化并发 |
Java 从 1996 年走到今天,每个版本都在解决开发者真实痛点:
学 Java 版本史,不是为了背年号,是为了看懂「为什么这样设计」——以后面试、做技术选型、读老项目代码,心里都有底。
如果你也在版本号里迷路过,或者面试被 JDK 8 问懵过,评论区聊聊你的经历。觉得这篇对你有用,点个赞、收个藏,让更多在学 Java 的朋友少踩点坑。