Java11新特性

推荐链接:

https://javaguide.cn/java/new-features/java11.html

HTTP Client 标准化

Java 9/10 → HttpClient 还是孵化 API

Java 11 → HttpClient 正式标准化(JEP 321),支持 HTTP/1.1 + HTTP/2,同步/异步 API 统一,极大改善了原有 HttpURLConnection 的痛点

实用性:业务开发可以直接用,尤其在轻量级项目;但在复杂场景,Apache HttpClient/OkHttp 仍然更合适。

同步 GET 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientSyncExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.build();

HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode());
System.out.println(response.body());
}
}

异步 GET 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

public class HttpClientAsyncExample {
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.build();

CompletableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());

future.thenApply(HttpResponse::body)
.thenAccept(System.out::println);

future.join(); // 等待异步完成
}
}

POST JSON 请求

1
2
3
4
5
6
7
8
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{\"name\":\"Ablaze\"}"))
.build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

String 增强

Java 11 String 新方法

  • isBlank()
  • strip() / stripLeading() / stripTrailing() :分别去除 两端、前导、后缀 的空白字符(支持 Unicode 空白,比 trim() 更强大)。
  • repeat(int) :重复当前字符串 N 次。
  • lines() :把字符串按行拆分为 Stream<String>
    "A\nB\nC".lines().count(); :返回此流中元素的计数
    "A\nB\nC".lines().collect(Collectors.toList()); :返回由行终止符分隔的字符串集合。

ZGC(可伸缩低延迟垃圾收集器)

ZGC 即 Z Garbage Collector,是一个可伸缩的、低延迟的垃圾收集器。

ZGC 主要为了满足如下目标进行设计:

  • GC 停顿时间不超过 10ms
  • 既能处理几百 MB 的小堆,也能处理几个 TB 的大堆
  • 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
  • 方便在此基础上引入新的 GC 特性和利用 colored 针以及 Load barriers 优化奠定基础
  • 当前只支持 Linux/x64 位平台

ZGC 目前 处在实验阶段,只支持 Linux/x64 平台。

与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。

在 ZGC 中出现 Stop The World 的情况会更少!