java112018.9.26发布,是一个LTS版本,本文将介绍该版本带来的主要新特性。

java11主要新特性一览

  • java.lang.String新增多个字符串处理方法
  • java.util.Optional类新增isEmpty()方法
  • 局部变量类型推断升级
  • 新的HTTP客户端API正式发布
  • 引入实验性的ZGC垃圾收集器

java.lang.String新增多个字符串处理方法

方法作用
isBlank()判断字符串是否为空白
strip()去除首尾空白
stripTrailing()去除尾部空格
stripLeading()去除首部空白
repeat(count)复制字符串
lines()将字符串转为java.util.stream.Stream流,每一行字符为流中的一个元素

代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.sunchaser.sparrow.javase.java11;

import java.util.stream.Stream;

/**
* java.lang.String新增多个字符串处理方法
*
* @author sunchaser admin@lilu.org.cn
* @since JDK11 2022/2/17
*/
public class StringMethod {
public static void main(String[] args) {
String str1 = " \t \n \t";
boolean blank = str1.isBlank();
// true
System.out.println("isBlank()==========>" + blank);

String str2 = " java 666! ";
String strip = str2.strip();
// "java 666!"
System.out.println("strip()============>" + strip);

String stripTrailing = str2.stripTrailing();
// " java 666!"
System.out.println("stripTrailing()====>" + stripTrailing);

String stripLeading = str2.stripLeading();
// "java 666! "
System.out.println("stripLeading()=====>" + stripLeading);

String str3 = "java";
String repeat = str3.repeat(3);
// "javajavajava"
System.out.println("repeat(count)======>" + repeat);

String str4 = " j \n a \t v \n a \n";
Stream<String> lines = str4.lines();
lines.forEach(line -> System.out.println("lines()============>" + line));
}
}

java.util.Optional类新增isEmpty()方法

isEmpty()方法用来判断value是否为空。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.sunchaser.sparrow.javase.java11;

import java.util.Optional;

/**
* java11中java.util.Optional类新增isEmpty方法用来判断value是否为空。
*
* @author sunchaser admin@lilu.org.cn
* @since JDK11 2022/2/17
*/
public class OptionalMethod {
public static void main(String[] args) {
Optional<Object> empty = Optional.empty();
Optional<String> op = Optional.of("java");
boolean empty1 = empty.isEmpty(); // true
boolean empty2 = op.isEmpty(); // false
System.out.println(empty1);
System.out.println(empty2);
}
}

局部变量类型推断升级

var上可以添加注解。

新的HTTP客户端API正式发布

HttpClient相关类的模块及包名从jdk.incubator.http修改为java.net.http,表示正式发布,变为可用状态。

引入实验性的ZGC垃圾收集器

在`G1`的基础上,`ZGC`做了以下改进:
  1. 动态调整大小的Region

G1中每个Region的大小是固定的,创建和销毁Region,可以动态调整大小,内存使用更高效。

  1. 不分代,干掉了RSets

G1中每个Region需要借助额外的RSets来记录“谁引用了我”,占用了额外的内存空间,每次对象移动时,RSets也需要更新,产生开销。

没有实现分代机制,每次都是并发的对所有region进行回收,不象G1是增量回收,所以用不着RSets。不分代可能带来的性能下降,会用下面马上提到的Colored Pointer && Load Barrier来优化。

  1. 带颜色的指针Colored Pointer

  2. 读屏障Load Barrier

  3. 重定位Relocation

  4. 多重映射Multi-Mapping

  5. 支持NUMA架构