从JDK 8到JDK 17的主要变化
从JDK 8到JDK 17的主要变化
Java从JDK 8到JDK 17经历了重大演进,下面概述主要变化和新特性:
JDK 9 (2017年9月)
-
模块系统(Project Jigsaw)
- 引入模块化系统,通过module-info.java定义模块
- 增强了安全性和可维护性
-
JShell
- 交互式REPL工具
-
集合工厂方法
List<String> list = List.of("a", "b", "c"); Set<String> set = Set.of("a", "b", "c"); Map<String, Integer> map = Map.of("a", 1, "b", 2);
JDK 10 (2018年3月)
- 局部变量类型推断(var)
var list = new ArrayList<String>();
JDK 11 (LTS, 2018年9月)
-
HTTP Client API标准化
- 支持HTTP/2和WebSocket
-
移除Java EE和CORBA模块
- 移除了javax.xml.ws等模块
-
单文件源代码运行
java HelloWorld.java
JDK 12-16 (非LTS版本)
-
Switch表达式(JDK 12预览, JDK 14标准化)
int numLetters = switch (day) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;default -> {String s = day.toString();yield s.length();} };
-
文本块(JDK 13预览, JDK 15标准化)
String html = """<html><body><p>Hello, world</p></body></html>""";
-
Records(JDK 14预览, JDK 16标准化)
record Point(int x, int y) {}
-
模式匹配instanceof(JDK 14预览, JDK 16标准化)
if (obj instanceof String s) {System.out.println(s.length()); }
JDK 17 (LTS, 2021年9月)
-
密封类(Sealed Classes)
public sealed class Shape permits Circle, Square, Rectangle {}
-
移除实验性AOT和JIT编译器
-
恢复始终严格浮点语义
其他重要变化
- 垃圾收集器改进:G1成为默认GC,引入ZGC和Shenandoah
- 性能提升:包括字符串压缩、改进的哈希算法等
- 弃用和移除:移除了Applet API、移除了Security Manager等
- 新的API:如新的日期时间API(在JDK 8中引入)、Process API更新等
迁移建议
-
从JDK 8迁移到JDK 17是一个重大升级,建议:
- 先升级到JDK 11(LTS),再升级到JDK 17
- 测试模块化兼容性(如果使用模块系统)
- 检查已弃用或移除的API
-
新项目建议直接使用JDK 17,它是最新的长期支持版本。