刚入行写Java的时候,就在想,为什么很多公司和网上教程用的都是Java8,而不是更新的版本?
后来发现大家又开始讨论要不要升级到Java17,或是新项目直接用Java17,但却几乎没看到有人提起中间的9、10、11...这些版本。
这让我非常困惑,Java 到底经历了什么?为什么跳过了那么多版本?
于是我查了一下,才发现,其实Java在发布策略上做过一个重大的转变。
为什么说 Java 8 是分水岭?
在 Java 8 之前,Java 被很多人吐槽:"语法太啰嗦,写起来像搬砖"。
但2014年,Java8横空出世,带来了两个改变命运的功能:
Lambda 表达式
让你可以用一行代码代替一个匿名内部类:
java
// 以前
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked!");
}
});
// Java 8:简洁
button.addActionListener(e -> System.out.println("Clicked!"));
Stream API
处理集合数据像写 SQL 一样流畅:
java
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
这两个特性,让 Java 从面向对象语言迈向了函数式编程的大门。
再加上默认方法(Default Methods)、新的日期时间API(java.time),Java8一下子变得现代和高效。
从此,Java 8 成了无数企业的标配,稳定、强大、生态又成熟。
Oracle 改变了游戏规则
2017年,Oracle宣布:Java将每6个月发布一个新版本!
这意味着:
- 不再等3年才出一个大版本
- 功能可以更快交付给开发者
听起来很美好?但代价是:大多数版本只活6个月。
Java 9 带来了什么?
这是 Java 9 最大的变化:引入模块化(Module System)。
目标很好:解决JAR地狱(依赖混乱)、让JVM更轻量。
但现实很骨感:
- 大量老项目无法直接兼容
- 反射机制被限制(很多框架崩溃)
- 学习成本高,企业不敢轻易升级
而且,Java9不是LTS!6个月后就被Java10取代了。
结果:没人敢在生产环境用Java9。它成了实验场,而不是主战场。
Java 10 的小步快跑
引入 var 关键字(局部变量类型推断):
java
var list = new ArrayList<String>(); // 编译器自动推断类型
依然非LTS,6个月后就退休。
Java 11 新节奏下的LTS
终于,Oracle给出了新规则下的第一个长期支持版!
主要变化:
- 移除了 Java EE 和 CORBA(这些已转为独立项目)
- HTTP Client 正式加入标准库(告别 Apache HttpClient)
- 支持 TLS 1.3,安全性提升
但问题在于:Java 11 相比 Java 8,语法上几乎没惊喜 。
很多企业会觉得:"既然 Java8 能用,为什么要冒险升级?"
所以,Java11 虽然是 LTS,却成了安静的过渡者,有用,但不够耀眼。
Java 12 到 16
从 Java 12 开始,每个版本都塞进几个新特性,让大家试用、反馈,成熟后再放进 LTS。
我们挑几个重要的看看:
| 版本 | 关键特性 | 意义 |
|---|---|---|
| Java 12 | Switch 表达式(预览) | 让 switch 从"语句"变成"表达式",可返回值 |
| Java 13 | 文本块(Text Blocks,预览) | 多行字符串不用再拼接 \n 和 + |
| Java 14 | instanceof 模式匹配(预览) Records(预览) |
减少样板代码,比如定义 DTO 更简单 |
| Java 15 | 密封类(Sealed Classes,预览) 文本块正式版 | 控制继承关系,提升类型安全 |
| Java 16 | Records 正式版 模式匹配增强 | 数据类一行搞定:record Point(int x, int y) {} |
注意:这些特性大多先以"预览"形式出现,经过两三个版本打磨,才在 Java 17 中正式落地。
这就像是先在小范围测试,再大规模推广,既保证创新,又控制风险。
为什么 Java 17 如此重要?
因为它是:
- 继 Java 8 后,第一个真正全面现代化的 LTS
- 集过去8年所有精华于一身
- 主流框架(如 Spring Boot 3)的新起点
Java 17 带来了哪些生产力革命?
1. Records(记录类) ------ 告别 getter/setter
java
// 以前:写几十行
public class Person {
private String name;
private int age;
// 构造器、getter、setter、equals、hashCode...
}
// Java 17:一行搞定
record Person(String name, int age) {}
2. 密封类(Sealed Classes) ------ 精准控制继承
java
public sealed class Shape permits Circle, Rectangle { }
final class Circle extends Shape { }
final class Rectangle extends Shape { }
// 其他类不能继承 Shape!
3. 文本块(Text Blocks) ------ 多行字符串清爽了
java
String json = """
{
"name": "Alice",
"age": 30
}
""";
4. Switch 表达式 ------ 更安全、更简洁
java
String type = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY -> "工作日";
case SATURDAY, SUNDAY -> "周末";
default -> "其他";
};
5. 性能飞跃
- ZGC(低延迟垃圾回收器)正式可用,停顿时间 <1ms
- 启动速度更快,内存占用更低
6. 生态全面拥抱
- Spring Boot 3.0+ 最低要求 Java 17
- Quarkus、Micronaut 等新框架优先支持 Java 17
- 云原生、容器化场景表现更佳
Java17不只是新,更是稳。
发展过程时间线
我们可以把这段历史画成一条线:
arduino
Java 8(2014)
│
├─ 函数式编程革命(Lambda + Stream)
│
▼
Java 9(2017)→ 模块化尝试(失败/谨慎采用)
│
▼
Java 10/11(2018)→ 新节奏确立,LTS 回归
│
▼
Java 12~16(2019--2021)→ 快速迭代,特性预览
│
▼
Java 17(2021)→ 集大成者,新黄金标准
Java 的进化逻辑很清晰:
- Java 8 打下现代化基础
- 中间版本快速试错、积累经验
- Java 17 收割成果,成为新一代基石
总结
简单来说,Java这十年走了一条很强大的路:
- Java 8 是第一个大升级,让代码一下子变短、变清爽,大家用着舒服,所以很多公司一直用到现在。
- 中间的版本(9 到 16)像是在试验,,新功能先放出来让大家试试,有问题就改,没问题就留着。
- Java 17 就是把这些试好的好功能打包起来,做成一个又稳又好用的新版本,适合现在的新项目。
所以,Java8 和 Java17 成了两个最受欢迎的版本: 一个代表经典可靠,一个代表现代高效。
本文首发于公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!
📌往期精彩
《代码里全是 new 对象,真的很 Low 吗?我认真想了一晚》