Http Client标准化

Java11对Java9中引入并在Java10中进行了更新的Http Client API进行了标准化,在前两个版本中进行孵化的同时,Http Client几乎被完全重写,并且现在完全支持异步非阻塞。

并且,Java11中,Http Client的包名由jdk.incubator.http改为java.net.http,该API通过CompleteableFuture提供非阻塞请求和响应语义。使用起来也很简单,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);

增强

Java11增加了一系列的字符串处理方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
//判断字符串是否为空
" ".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增强

新增了empty()方法来判断指定的Optional对象是否为空

1
2
var op = Optional.empty();
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空

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

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

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

  • GC停顿时间不超过10ms
  • 技能处理几百MB的小堆,也能处理几个TB的大堆
  • 应用吞吐能力不会下降超过15%
  • 方便在此基础上引入新的GC特性和利用colored针以及Load barries优化奠定基础
  • 只支持Linux/64位平台

与CMS中的ParNew和G1类似,ZGC也采用标记-复制算法,不过GZC对该算法做了重大改进。
在ZGC中出现Stop TheWorld的情况会更少。

Lamdba参数的局部变量语法

从Java10开始,便引入了局部变量类型推断这一关键特性。类型推断允许使用关键字var作为局部变量的类型而不是实际类型,编译器根据分配给变量的值推断出类型。

Java10中对var关键字存在几个限制

  • 只能用于局部变量上
  • 声明时必须初始化
  • 不能用作方法参数
  • 不能在Lamdba表达式中使用

Java11 开始允许开发者在Lamdba表达式中使用var进行参数声明。

1
2
3
// 下面两者是等价的
Consumer<String> consumer = (var i) -> System.out.println(i);
Consumer<String> consumer = (String i) -> System.out.println(i);

启动单文件源代码程序

这意味着我们可以运行单一文件的Java源代码。此功能允许使用Java解释器直接执行Java源代码。源代码在内存中编译,然后由解释器执行,不需要在磁盘上生成.class文件了。唯一的约束在于所有相关的类必须定义在同一个Java文件中。

对于Java初学者并希望尝试简单程序的人特别有用,并且能和jshell一起使用。一定程度上增强了使用Java来写脚本程序的能力。

其他

  • 新的垃圾回收器Epsilon:一个完全小及的GC实现,分配有限的内存资源,最大限度的降低内存占用和内存吞吐延迟时间。
  • 低开销的Heap Profiling:Java11中提供一种低开销的Java堆分配采样方法,能够得到对分配的Java对象信息,并且能够通过JVM访问堆信息
  • TLS1.3协议:Java11中包含了栓除安全性(TLS)1.3规范的实现,替换了之前版本中包含的TLS,包括TLS1.2,同时还改进了其他TLS功能,例如OCSP装订扩展,以及会话散列和扩展主密钥扩展,在安全性和新跟那个方面也做了很多提升
  • 飞行记录器:飞行记录器之前是商业版JDK的一项分析工具,但在Java11中,其代码被包含到公开代码库中,这样所有人都能使用该功能了。