Java 11 新特性概览(重要)
Java 11 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 是继 Java 8 之后的第一个长期支持(Long-Term-Support)版本,Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。
下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:
- JEP 321: HTTP Client (Standard)
- JEP 323: Local-Variable Syntax for Lambda Parameters
- JEP 330: Launch Single-File Source-Code Programs
- JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
JEP 321: HTTP Client(HTTP 客户端,标准版)
📝 通俗解释:Java 自带的上网工具,终于好用了!支持异步(不卡顿)和非阻塞(效率高)。
Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 HTTP Client API 进行了标准化,在前两个版本中进行孵化的同时,HTTP Client 几乎被完全重写,并且现在完全支持异步非阻塞。
并且,Java 11 中,HTTP Client 的包名由 jdk.incubator.http 改为 java.net.http,该 API 通过 CompletableFuture 提供非阻塞请求和响应语义。使用起来也很简单,如下:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://javastack.cn"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);JEP 333: ZGC(可扩展的低延迟垃圾收集器,实验性)
📝 通俗解释:一个超级快的垃圾回收器,为了让 Java 程序不仅跑得稳,而且停顿时间极短(<10ms)。
ZGC 即 Z Garbage Collector,是一个可伸缩的、低延迟的垃圾收集器。
ZGC 主要为了满足如下目标进行设计:
- GC 停顿时间不超过 10ms
- 既能处理几百 MB 的小堆,也能处理几个 TB 的大堆
- 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
- 方便在此基础上引入新的 GC 特性和利用 colored 针以及 Load barriers 优化奠定基础
- 当前只支持 Linux/x64 位平台
ZGC 目前 处在实验阶段,只支持 Linux/x64 平台。注意:ZGC 在 Java 15 成为正式特性,在 Java 21 引入分代 ZGC。
与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。
在 ZGC 中出现 Stop The World 的情况会更少!
详情可以看:《新一代垃圾回收器 ZGC 的探索与实践》
JEP 323: Local-Variable Syntax for Lambda Parameters(Lambda 参数的局部变量语法)
📝 通俗解释:Lambda 表达式里也可以用 var 来偷懒写变量类型了。
从 Java 10 开始,便引入了局部变量类型推断这一关键特性。类型推断允许使用关键字 var 作为局部变量的类型而不是实际类型,编译器根据分配给变量的值推断出类型。
Java 10 中对 var 关键字存在几个限制
- 只能用于局部变量上
- 声明时必须初始化
- 不能用作方法参数
- 不能在 Lambda 表达式中使用
Java11 开始允许开发者在 Lambda 表达式中使用 var 进行参数声明。
// 下面两者是等价的
Consumer<String> consumer = (var i) -> System.out.println(i);
Consumer<String> consumer = (String i) -> System.out.println(i);JEP 330: Launch Single-File Source-Code Programs(启动单文件源代码程序)
📝 通俗解释:写个简单的 Java 程序不用编译成 class 文件了,直接 java HelloWorld.java 就能跑,像脚本一样方便。
这意味着我们可以运行单一文件的 Java 源代码。此功能允许使用 Java 解释器直接执行 Java 源代码。源代码在内存中编译,然后由解释器执行,不需要在磁盘上生成 .class 文件了。唯一的约束在于所有相关的类必须定义在同一个 Java 文件中。
对于 Java 初学者并希望尝试简单程序的人特别有用,并且能和 jshell 一起使用,一定程度上增强了使用 Java 来写脚本程序的能力。
API 增强
并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。
在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 String.isBlank() 这种在现有类中增加几个方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。
📝 通俗解释
- API 增强:日常补丁。
- String 终于加了
isBlank(判空)、strip(去空格)、lines(分行)。- 以前这些都得用第三方工具包(如 Apache Commons Lang),现在 JDK 自带了。
String 增强
📝 通俗解释:字符串多了几个好用的方法,比如判断是不是空白、去空格、重复字符串。
Java 11 增加了一系列的字符串处理方法:
//判断字符串是否为空
" ".isBlank();//true
//去除字符串首尾空格
" Java ".strip();// "Java"
//去除字符串首部空格
" Java ".stripLeading(); // "Java "
//去除字符串尾部空格
" Java ".stripTrailing(); // "Java"
//重复字符串多少次
"Java".repeat(3); // "JavaJavaJava"
//返回由行终止符分隔的字符串集合。
"A\nB\nC".lines().count(); // 3
"A\nB\nC".lines().collect(Collectors.toList());Optional 增强
📝 通俗解释:Optional 加了个 isEmpty(),终于不用反着写 !isPresent() 了。
新增了isEmpty()方法来判断指定的 Optional 对象是否为空。
var op = Optional.empty();
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空其他新特性
- 新的垃圾回收器 Epsilon:一个完全消极的 GC 实现,分配有限的内存资源,最大限度的降低内存占用和内存吞吐延迟时间
- 低开销的 Heap Profiling:Java 11 中提供一种低开销的 Java 堆分配采样方法,能够得到堆分配的 Java 对象信息,并且能够通过 JVMTI 访问堆信息
- TLS1.3 协议:Java 11 中包含了传输层安全性(TLS)1.3 规范(RFC 8446)的实现,替换了之前版本中包含的 TLS,包括 TLS 1.2,同时还改进了其他 TLS 功能,例如 OCSP 装订扩展(RFC 6066,RFC 6961),以及会话散列和扩展主密钥扩展(RFC 7627),在安全性和性能方面也做了很多提升
- 飞行记录器(Java Flight Recorder):飞行记录器之前是商业版 JDK 的一项分析工具,但在 Java 11 中,其代码被包含到公开代码库中,这样所有人都能使用该功能了。
- ......
📝 通俗解释
- Epsilon GC:不做事的 GC。只管分配内存,不管回收。用来做性能测试或者短命任务(跑完就关,不需要 GC)。
- Flight Recorder (JFR):黑匣子。以前是要钱的商业功能,现在免费了。它可以详细记录 JVM 运行时的各种数据(CPU、内存、锁),对线上故障排查非常有用,而且对性能影响极小。
参考
- JDK 11 Release Notes:https://www.oracle.com/java/technologies/javase/11-relnote-issues.html
- Java 11 – Features and Comparison:https://www.geeksforgeeks.org/java-11-features-and-comparison/
