jdk8 后各个版本的新特性详解
----------------------------------------------------------------------------------------------------
Java 版本迭代中,LTS(长期支持)版本(如 8、11、17)因提供 5-8 年的官方支持,被企业广泛采用。以下按版本顺序梳理 JDK 8 及之后的核心新特性,重点突出 LTS 版本的关键更新:
一、JDK 8(2014 年,LTS)—— 革命性的版本
JDK 8 引入了大量改变 Java 编程范式的特性,是 Java 历史上最具影响力的版本之一:
- Lambda 表达式:用简洁语法实现函数式编程,替代匿名内部类(如
(a, b) -> a + b)。 - Stream API:声明式处理集合(过滤、映射、聚合等),支持并行处理(
parallelStream())。 - Optional 类:封装可能为
null的值,避免空指针异常(NPE)。 - 新日期时间 API(
java.time包):替代线程不安全的Date/Calendar,提供LocalDate、Instant等不可变类。 - CompletableFuture:增强异步编程,支持链式操作、异常处理和任务组合,替代传统
Future。 - 接口默认方法与静态方法:接口可定义带实现的方法(
default关键字),解决接口升级兼容性问题。 - 方法引用:简化 Lambda 表达式(如
Integer::parseInt替代s -> Integer.parseInt(s))。
二、JDK 9(2017 年)—— 模块化与工具增强
JDK 9 重点是模块化系统,同时增强了现有 API:
-
模块系统(Project Jigsaw):引入
module-info.java定义模块依赖,解决 “类路径地狱”(类冲突、冗余依赖),实现代码封装与隔离。例:module com.example.app { requires java.base; }(声明依赖基础模块)。 -
接口私有方法:接口中可定义
private方法,供默认方法调用,避免代码重复(default方法可调用私有方法)。 -
集合工厂方法:新增
List.of()、Set.of()、Map.of()等静态方法,创建不可变集合(比Collections.unmodifiableList()更高效)。例:List<String> list = List.of("a", "b");(不可修改,添加元素会抛异常)。 -
JShell(交互式编程工具):支持即时执行 Java 代码片段(无需写类和
main方法),适合快速测试和学习。 -
Stream API 增强:新增
takeWhile(Predicate)(保留满足条件的前缀)、dropWhile(Predicate)(丢弃满足条件的前缀)、ofNullable(T)(支持单元素空流)。 -
try-with-resources 增强:可在
try括号中使用已定义的资源变量(无需重新声明)。例:InputStream is = new FileInputStream("a.txt"); try (is) { ... }
三、JDK 11(2018 年,LTS)—— 实用 API 与性能优化
JDK 11 作为继 8 之后的第二个 LTS 版本,聚焦稳定性和实用性:
-
HTTP 客户端(标准化):正式引入
java.net.http包,替代老旧的HttpURLConnection,支持 HTTP/2 和 WebSocket,API 更简洁(基于CompletableFuture实现异步)。例:java运行HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println); -
局部变量类型推断增强(
var):var可用于 Lambda 参数(需显式声明泛型),提升复杂 Lambda 的可读性。例:(var x, var y) -> x + y(适用于长参数名场景)。 -
字符串方法增强:
strip():去除前后空白(比trim()更智能,支持 Unicode 空白字符)。isBlank():判断字符串是否为空或仅含空白字符。lines():按行分割字符串,返回Stream<String>。repeat(int n):重复字符串 n 次。
-
Files 工具类增强:
Files.readString(Path):直接读取文件内容为字符串(适用于文本文件)。Files.writeString(Path, String):直接写入字符串到文件。
-
ZGC(实验性低延迟垃圾收集器):引入可扩展、低延迟的 ZGC(Z Garbage Collector),暂停时间不超过 10ms,支持 TB 级内存。
-
移除冗余组件:移除过时的
CORBA、Java EE和JAX-WS模块,精简 JDK。
四、JDK 17(2021 年,LTS)—— 现代语言特性与性能飞跃
JDK 17 是目前企业主流选择的 LTS 版本,整合了 12-16 版本的预览特性,增强语言表达能力:
-
密封类(Sealed Classes):限制类的继承关系,用
sealed修饰类,并通过permits指定允许继承的子类,避免无限制扩展导致的混乱。例:java运行public sealed class Shape permits Circle, Rectangle { ... } final class Circle extends Shape { ... } // 必须是 final 或 sealed -
模式匹配增强(
instanceof):简化类型判断与转换,无需显式强制转型。例:java运行if (obj instanceof String s) { // 若 obj 是 String,直接用 s 引用 System.out.println(s.length()); } -
switch 表达式增强:
- 支持箭头语法(
case x -> ...),无需break。 - 支持
yield关键字返回值(替代return,更清晰)。 - 可作为表达式直接赋值。
例:
java运行int result = switch (day) { case MONDAY, TUESDAY -> 3; case WEDNESDAY -> 2; default -> { yield 1; } }; - 支持箭头语法(
-
记录类(Records):简化 “数据载体类”(POJO)的定义,自动生成
equals()、hashCode()、toString()和 getter 方法(不可变)。例:public record User(String id, String name) {}(等价于带id、name的不可变类)。 -
垃圾收集器升级:
- ZGC 和 Shenandoah 从实验性变为生产就绪(默认仍为 G1),支持低延迟、大内存场景。
- 移除 CMS 收集器。
-
其他实用特性:
- 向量 API(孵化):高效处理数值向量运算(适合机器学习等场景)。
- 增强伪随机数生成器:新增
RandomGenerator接口,统一各类随机数生成器。 - 移除实验性的 AOT( Ahead-of-Time)编译和 JIT 编译器。
五、总结:版本选择建议
- JDK 8:最广泛兼容,适合依赖旧库的项目,但缺乏现代语言特性。
- JDK 11:平衡兼容性与新特性,适合需要 HTTP 客户端、ZGC 且对新语法要求不高的场景。
- JDK 17:推荐新项目使用,具备密封类、记录类等现代特性,性能更优,且是目前支持周期最长的 LTS 版本(至 2029 年)。
各版本的核心演进逻辑:从 “函数式编程基础”(8)→“模块化与工具链”(9)→“实用 API 增强”(11)→“现代语言特性与性能”(17),逐步提升 Java 的简洁性、安全性和执行效率。
jdk 8 后 各个版本的新特性 详解
JDK 8 之后,Java 版本迭代加速,每 6 个月发布一个主版本,并每 3 年推出一个 LTS(长期支持)版本(如 11、17、21)。以下按版本顺序详解 JDK 9 及之后的核心新特性,重点突出语言特性、API 增强、性能优化等关键更新:
一、JDK 9(2017 年)—— 模块化与基础能力升级
JDK 9 的核心是模块化系统,同时对现有 API 进行了大幅增强,为后续版本奠定了基础。
-
模块系统(Project Jigsaw)引入
module-info.java文件,将代码封装为模块,明确声明依赖关系和对外暴露的接口,解决传统 “类路径地狱”(类冲突、冗余依赖)问题。示例:java运行// module-info.java module com.example.service { requires java.base; // 依赖基础模块(默认隐式依赖) requires com.example.api; // 依赖其他模块 exports com.example.service.user; // 暴露指定包 } -
接口私有方法允许接口中定义
private方法,供默认方法(default)或静态方法调用,减少代码冗余。java运行public interface MathUtils { default int add(int a, int b) { log("add called"); // 调用私有方法 return a + b; } private void log(String msg) { // 私有方法 System.out.println("[LOG] " + msg); } } -
不可变集合工厂方法新增
List.of()、Set.of()、Map.of()等静态方法,创建轻量、不可变的集合(比Collections.unmodifiableXXX更高效,修改会抛UnsupportedOperationException)。java运行List<String> list = List.of("a", "b", "c"); Set<Integer> set = Set.of(1, 2, 3); Map<String, Integer> map = Map.of("one", 1, "two", 2); -
JShell(交互式编程工具)支持即时执行 Java 代码片段,无需编写类和
main方法,适合快速测试和学习。bashjshell> int a = 10; a ==> 10 jshell> a * 2 $2 ==> 20 -
Stream API 增强
takeWhile(Predicate):从流开头开始,保留满足条件的元素(遇到第一个不满足的就停止)。dropWhile(Predicate):从流开头开始,丢弃满足条件的元素(遇到第一个不满足的就保留剩余)。ofNullable(T):创建包含单个元素的流(支持null,此时返回空流)。
java运行List<Integer> nums = List.of(1, 2, 3, 4, 5); nums.stream().takeWhile(n -> n < 3).forEach(System.out::print); // 1 2
二、JDK 10(2018 年)—— 局部变量类型推断
JDK 10 聚焦简化代码,核心特性是局部变量类型推断。
- 局部变量类型推断(
var关键字)允许用var声明局部变量,编译器根据赋值自动推断类型,减少代码冗余(仅适用于局部变量,不能用于字段、方法参数或返回值)。java运行var list = new ArrayList<String>(); // 推断为 ArrayList<String> var map = Map.of("a", 1); // 推断为 Map<String, Integer> var str = "hello"; // 推断为 String
三、JDK 11(2018 年,LTS)—— 实用工具与性能优化
作为第二个 LTS 版本,JDK 11 整合了 9-10 的特性,并新增大量实用功能,同时提升稳定性。
-
HTTP 客户端(标准化,
java.net.http包)替代老旧的HttpURLConnection,支持 HTTP/2 和 WebSocket,API 简洁且基于CompletableFuture实现异步操作。java运行HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com")) .header("Accept", "application/json") .build(); // 异步发送请求 client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); // 等待结果 -
字符串方法增强
isBlank():判断字符串是否为空或仅含空白字符(比isEmpty()更智能)。strip()/stripLeading()/stripTrailing():去除空白(支持 Unicode 空白字符,如全角空格)。lines():按行分割字符串,返回Stream<String>。repeat(int n):重复字符串n次。
java运行" \t\n".isBlank(); // true(空白字符) " hello ".strip(); // "hello"(去除前后空白) "a\nb\nc".lines().count(); // 3(3行) "ab".repeat(3); // "ababab" -
Files 工具类增强新增
readString(Path)和writeString(Path, String)方法,简化文本文件读写:java运行// 读取文件内容为字符串 String content = Files.readString(Path.of("test.txt")); // 写入字符串到文件 Files.writeString(Path.of("output.txt"), "Hello, JDK 11"); -
ZGC(实验性低延迟垃圾收集器)引入 ZGC(Z Garbage Collector),目标是暂停时间不超过 10ms,支持 TB 级内存,适合高吞吐量、低延迟场景(JDK 15 中成为生产就绪)。
-
移除冗余组件移除过时的
CORBA、Java EE相关模块(如java.xml.ws),精简 JDK 体积。
四、JDK 12(2019 年)—— 语法简化与性能工具
-
switch 表达式(预览)支持箭头语法(
case x -> ...),无需break,且可作为表达式返回值(需通过--enable-preview启用)。java运行int day = 2; String result = switch (day) { case 1 -> "周一"; case 2 -> "周二"; default -> "其他"; }; -
数字格式化工具(
CompactNumberFormat)简化大数字的格式化(如 “1000”→“1K”,“1000000”→“1M”):java运行NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); System.out.println(fmt.format(12345)); // "12K" -
JVM 常量 API新增
java.lang.constant包,提供对常量池的强类型访问(如ClassDesc、MethodTypeDesc)。
五、JDK 13(2019 年)—— 文本块与网络增强
-
文本块(Text Blocks,预览)用三重引号(
""")定义多行字符串,自动保留换行和缩进,避免手动拼接\n和转义字符。java运行String json = """ { "name": "Alice", "age": 30 } """; -
switch 表达式增强(预览)新增
yield关键字,用于在代码块中返回值(替代return,更清晰):java运行int num = switch (day) { case 1, 2, 3, 4, 5 -> 5; case 6, 7 -> { System.out.println("周末"); yield 2; // 返回值 } default -> 0; };
六、JDK 14(2020 年)—— 模式匹配与空指针优化
-
instanceof模式匹配(预览)简化类型判断与转换,无需显式强制转型:java运行if (obj instanceof String s) { // 若 obj 是 String,直接用 s 引用 System.out.println(s.length()); // 无需 (String) obj 转型 } -
Records(预览)用于定义 “数据载体类”(POJO),自动生成
equals()、hashCode()、toString()和 getter 方法(不可变):java运行record User(String id, String name) {} // 等价于带 id、name 的不可变类 User user = new User("1", "Alice"); System.out.println(user.name()); // "Alice"(自动生成的 getter) -
空指针异常(NPE)信息优化NPE 堆栈信息会显示具体的空值变量,便于调试:plaintext
// 原信息:NullPointerException // 新信息:Cannot invoke "String.length()" because "s" is null
七、JDK 15(2020 年)—— 密封类与文本块正式版
-
密封类(Sealed Classes,预览)限制类的继承关系,用
sealed修饰类,并通过permits指定允许继承的子类,避免无限制扩展:java运行public sealed class Shape permits Circle, Rectangle, Triangle { // 密封类的方法... } final class Circle extends Shape {} // 必须是 final、sealed 或 non-sealed -
文本块(正式版)从预览转为正式特性,支持
\s转义符(忽略当前行的尾随行分隔符):java运行String html = """ <html> <body>\s <p>Hello</p> </body> </html> """; -
ZGC 生产就绪低延迟垃圾收集器 ZGC 从实验性变为正式支持,适合大内存场景。
八、JDK 16(2021 年)—— Records 正式与模式匹配增强
-
Records(正式版)数据载体类的简化定义正式落地,不可变特性确保线程安全:java运行
record Point(int x, int y) { // 可自定义构造方法或方法,但不能添加非静态字段 public Point { if (x < 0 || y < 0) throw new IllegalArgumentException(); } } -
instanceof模式匹配(正式版)从预览转为正式特性,广泛用于简化类型判断逻辑。 -
Vector API(孵化)提供向量运算支持,优化数值计算性能(如机器学习、科学计算)。
九、JDK 17(2021 年,LTS)—— 现代语言特性集大成者
作为第三个 LTS 版本,JDK 17 整合了 12-16 的核心特性,成为企业主流选择。
-
密封类(正式版)限制继承关系,增强代码可维护性(如框架设计中定义固定扩展点)。
-
switch 表达式(正式版)箭头语法和
yield关键字正式支持,替代传统switch的冗余写法。 -
移除实验性特性移除 AOT 编译和 JIT 编译器,精简 JDK。
-
Shenandoah 垃圾收集器(生产就绪)低延迟垃圾收集器 Shenandoah 从实验性变为正式支持,适合需要快速响应的场景。
-
其他特性
- 增强伪随机数生成器(
RandomGenerator接口)。 - 禁止对
final类进行子类化的反射操作(增强安全性)。
- 增强伪随机数生成器(
十、JDK 18-20(2022-2023 年)—— 预览特性迭代
-
JDK 18:
- 文本块增强(
@符号支持,避免转义)。 - 虚拟线程(预览,轻量级线程,大幅提升并发性能)。
- 文本块增强(
-
JDK 19:
- 虚拟线程(二次预览)。
- 结构化并发(预览,简化多线程代码的错误处理和取消操作)。
-
JDK 20:
- 虚拟线程(三次预览)。
- 模式匹配 for
switch(预览,支持对对象属性的匹配)。
十一、JDK 21(2023 年,LTS)—— 虚拟线程与模式匹配
最新 LTS 版本,聚焦并发编程和语法简化。
-
虚拟线程(正式版)轻量级线程(用户态线程),由 JVM 管理,无需绑定操作系统线程,可创建数百万级线程,大幅降低并发编程成本:java运行
// 启动 1000 个虚拟线程 for (int i = 0; i < 1000; i++) { Thread.startVirtualThread(() -> { // 执行任务(如 HTTP 请求、数据库操作) }); } -
模式匹配 for
switch(正式版)支持对对象的属性、类型进行多条件匹配,替代复杂的if-else链:java运行Object obj = ...; String result = switch (obj) { case Integer i -> "整数:" + i; case String s && s.length() > 5 -> "长字符串:" + s; case null -> "空值"; default -> "其他类型"; }; -
结构化并发(预览)将多个相关线程视为一个 “任务单元”,简化异常处理和取消操作,避免线程泄漏。
总结:版本演进核心脉络
JDK 8 之后的版本演进呈现三大趋势:
- 语言简化:从
var推断、文本块到 Records、模式匹配,持续减少样板代码。 - 并发增强:从
CompletableFuture到虚拟线程、结构化并发,降低高并发编程门槛。 - 性能与安全:ZGC、Shenandoah 等低延迟 GC 普及,加强类型安全和反射限制。
版本选择建议:
- 追求稳定性和兼容性:选择 JDK 17(支持至 2029 年,特性丰富)。
- 探索最新特性:选择 JDK 21(虚拟线程等革命性特性,适合新项目)。
- 老旧系统迁移:从 JDK 8 逐步过渡到 JDK 11,再升级到 17/21。
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号