2022-03-01 18:16:51 +08:00
|
|
|
|
---
|
2026-01-26 22:09:42 +08:00
|
|
|
|
title: Java 11 新特性概览(重要)
|
2026-01-16 21:04:11 +08:00
|
|
|
|
description: 总结 JDK 11 的更新,关注新 HTTP 客户端与字符串增强等实用特性。
|
2022-03-01 18:16:51 +08:00
|
|
|
|
category: Java
|
|
|
|
|
|
tag:
|
|
|
|
|
|
- Java新特性
|
2025-11-17 11:11:54 +08:00
|
|
|
|
head:
|
|
|
|
|
|
- - meta
|
|
|
|
|
|
- name: keywords
|
|
|
|
|
|
content: Java 11,JDK11,LTS,HTTP 客户端,字符串 API,移除特性
|
2022-03-01 18:16:51 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
Java 11 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 是继 Java 8 之后的第一个长期支持(Long-Term-Support)版本,Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2022-12-03 11:14:20 +08:00
|
|
|
|
下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。
|
|
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|

|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-27 15:16:00 +08:00
|
|
|
|
下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:
|
|
|
|
|
|
|
|
|
|
|
|

|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
这篇文章会挑选其中较为重要的一些新特性进行详细介绍:
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
- [JEP 321: HTTP Client (Standard)](https://openjdk.org/jeps/321)
|
|
|
|
|
|
- [JEP 323: Local-Variable Syntax for Lambda Parameters](https://openjdk.org/jeps/323)
|
|
|
|
|
|
- [JEP 330: Launch Single-File Source-Code Programs](https://openjdk.org/jeps/330)
|
|
|
|
|
|
- [JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)](https://openjdk.org/jeps/333)
|
|
|
|
|
|
|
|
|
|
|
|
## JEP 321: HTTP Client(HTTP 客户端,标准版)
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-27 15:16:00 +08:00
|
|
|
|
Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 HTTP Client API 进行了标准化,在前两个版本中进行孵化的同时,HTTP Client 几乎被完全重写,并且现在完全支持异步非阻塞。
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-27 15:16:00 +08:00
|
|
|
|
并且,Java 11 中,HTTP Client 的包名由 `jdk.incubator.http` 改为 `java.net.http`,该 API 通过 `CompletableFuture` 提供非阻塞请求和响应语义。使用起来也很简单,如下:
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
|
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);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
## JEP 333: ZGC(可扩展的低延迟垃圾收集器,实验性)
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
|
|
|
|
|
**ZGC 即 Z Garbage Collector**,是一个可伸缩的、低延迟的垃圾收集器。
|
|
|
|
|
|
|
|
|
|
|
|
ZGC 主要为了满足如下目标进行设计:
|
|
|
|
|
|
|
|
|
|
|
|
- GC 停顿时间不超过 10ms
|
2025-02-15 13:55:47 +08:00
|
|
|
|
- 既能处理几百 MB 的小堆,也能处理几个 TB 的大堆
|
2022-03-01 18:16:51 +08:00
|
|
|
|
- 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
|
|
|
|
|
|
- 方便在此基础上引入新的 GC 特性和利用 colored 针以及 Load barriers 优化奠定基础
|
|
|
|
|
|
- 当前只支持 Linux/x64 位平台
|
|
|
|
|
|
|
2026-01-27 15:16:00 +08:00
|
|
|
|
ZGC 目前 **处在实验阶段**,只支持 Linux/x64 平台。注意:ZGC 在 Java 15 成为正式特性,在 Java 21 引入分代 ZGC。
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
|
|
|
|
|
与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。
|
|
|
|
|
|
|
|
|
|
|
|
在 ZGC 中出现 Stop The World 的情况会更少!
|
|
|
|
|
|
|
2023-05-05 12:39:01 +08:00
|
|
|
|
详情可以看:[《新一代垃圾回收器 ZGC 的探索与实践》](https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html)
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
## JEP 323: Local-Variable Syntax for Lambda Parameters(Lambda 参数的局部变量语法)
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
|
|
|
|
|
从 Java 10 开始,便引入了局部变量类型推断这一关键特性。类型推断允许使用关键字 var 作为局部变量的类型而不是实际类型,编译器根据分配给变量的值推断出类型。
|
|
|
|
|
|
|
|
|
|
|
|
Java 10 中对 var 关键字存在几个限制
|
|
|
|
|
|
|
|
|
|
|
|
- 只能用于局部变量上
|
|
|
|
|
|
- 声明时必须初始化
|
|
|
|
|
|
- 不能用作方法参数
|
|
|
|
|
|
- 不能在 Lambda 表达式中使用
|
|
|
|
|
|
|
|
|
|
|
|
Java11 开始允许开发者在 Lambda 表达式中使用 var 进行参数声明。
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
|
// 下面两者是等价的
|
|
|
|
|
|
Consumer<String> consumer = (var i) -> System.out.println(i);
|
|
|
|
|
|
Consumer<String> consumer = (String i) -> System.out.println(i);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
## JEP 330: Launch Single-File Source-Code Programs(启动单文件源代码程序)
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
|
|
|
|
|
这意味着我们可以运行单一文件的 Java 源代码。此功能允许使用 Java 解释器直接执行 Java 源代码。源代码在内存中编译,然后由解释器执行,不需要在磁盘上生成 `.class` 文件了。唯一的约束在于所有相关的类必须定义在同一个 Java 文件中。
|
|
|
|
|
|
|
2026-01-26 16:07:47 +08:00
|
|
|
|
对于 Java 初学者并希望尝试简单程序的人特别有用,并且能和 jshell 一起使用,一定程度上增强了使用 Java 来写脚本程序的能力。
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2026-01-26 22:09:42 +08:00
|
|
|
|
## API 增强
|
|
|
|
|
|
|
|
|
|
|
|
并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。
|
|
|
|
|
|
|
|
|
|
|
|
在 JDK 的开发流程中:**JEP** 通常用于重大的改变,例如引入新的语言特性(如 `var`)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 `String.isBlank()` 这种在现有类中增加几个方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 **JBS (JDK Bug System)** 的工单(Ticket)进行提交和评审,然后随版本直接发布。
|
|
|
|
|
|
|
|
|
|
|
|
### String 增强
|
|
|
|
|
|
|
|
|
|
|
|
Java 11 增加了一系列的字符串处理方法:
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
|
//判断字符串是否为空
|
|
|
|
|
|
" ".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 增强
|
|
|
|
|
|
|
|
|
|
|
|
新增了`isEmpty()`方法来判断指定的 `Optional` 对象是否为空。
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
|
var op = Optional.empty();
|
|
|
|
|
|
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2022-10-04 12:33:26 +08:00
|
|
|
|
## 其他新特性
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
2023-05-05 12:39:01 +08:00
|
|
|
|
- **新的垃圾回收器 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 中,其代码被包含到公开代码库中,这样所有人都能使用该功能了。
|
2026-01-26 22:09:42 +08:00
|
|
|
|
- ......
|
2022-03-01 18:16:51 +08:00
|
|
|
|
|
|
|
|
|
|
## 参考
|
|
|
|
|
|
|
2023-10-27 06:49:28 +08:00
|
|
|
|
- JDK 11 Release Notes:<https://www.oracle.com/java/technologies/javase/11-relnote-issues.html>
|
2023-05-05 12:33:52 +08:00
|
|
|
|
- Java 11 – Features and Comparison:<https://www.geeksforgeeks.org/java-11-features-and-comparison/>
|
2023-08-07 18:56:33 +08:00
|
|
|
|
|
2023-10-27 06:44:02 +08:00
|
|
|
|
<!-- @include: @article-footer.snippet.md -->
|