新特性(4) API的变化
1、Optional
Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。如果值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional提供很多有用的方法,这里我们不用显式进行空值检测。
- 创建Optional类对象的方法:
- static Optional empty() :用来创建一个空的Optional实例
- static Optional of(T value) :用来创建一个Optional实例,value必须非空
- static <T> Optional<T> ofNullable(T value) :用来创建一个Optional实例,value可能是空,也可能非空
- 判断Optional容器中是否包含对象:
- boolean isPresent() : 判断Optional容器中的值是否存在
- void ifPresent(Consumer<? super T> consumer) :判断Optional容器中的值是否存在,如果存在,就对它进行Consumer指定的操作,如果不存在就不做
获取Optional容器的对象:
- T get(): 如果调用对象包含值,返回该值。否则抛异常。T get()与of(T value)配合使用
- T orElse(T other):orElse(T other) 与ofNullable(T value)配合使用,如果Optional容器中非空,就返回所包装值,如果为空,就用orElse(T other)other指定的默认值(备选)代替
- T orElseGet(Supplier<? extends T> other) :如果Optional容器中非空,就返回所包装值,如果为空,就用Supplier接口的Lambda表达式提供的值代替
- T orElseThrow(Supplier<? extends X> exceptionSupplier) :如果Optional容器中非空,就返回所包装值,如果为空,就抛出指定的异常类型代替原来的NoSuchElementException
2、String的存储结构
Jdk9;String 不再采用 char[] 来存储,改成了 byte[] 加上编码标记,节约了一些空间。
11新特性:新增了一系列字符串处理方法
描述 | 举例 |
判断字符串是否为空白 | " ".isBlank(); // true |
去除首尾空白 | " Javastack ".strip(); // "Javastack" |
去除尾部空格 | " Javastack ".stripTrailing(); // " Javastack" |
去除首部空格 | " Javastack ".stripLeading(); // "Javastack " |
复制字符串 | "Java".repeat(3);// "JavaJavaJava" |
行数统计 | "A\nB\nC".lines().count(); // 3 |
JDK12新特性:String 实现了 Constable 接口
java.lang.constant.Constable接口定义了抽象方法:
public interface Constable {
Optional<? extends ConstantDesc> describeConstable();
}
实质上:调用 Optional.of 方法返回一个 Optional 类型。
JDK12新特性:String新增方法
String的transform(Function)
var result = "foo".transform(input -> input + " bar");
System.out.println(result); //foo bar
3、GC新特性
GC是Java主要优势之一。 然而,当GC停顿太长,就会开始影响应用的响应时间。随着现代系统中内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存, 并且无需长时间的GC暂停时间。
JDK9以后默认的垃圾回收器是G1GC。
JDK10 : 为G1提供并行的Full GC
G1最大的亮点就是可以尽量的避免full gc。但毕竟是“尽量”,在有些情况下,G1就要进行full gc了,比如如果它无法足够快的回收内存的时候,它就会强制停止所有的应用线程然后清理。
在Java10之前,一个单线程版的标记-清除-压缩算法被用于full gc。为了尽量减少full gc带来的影响,在Java10中,就把之前的那个单线程版的标记-清除-压缩的full gc算法改成了支持多个线程同时full gc。这样也算是减少了full gc所带来的停顿,从而提高性能。
你可以通过-XX:ParallelGCThreads参数来指定用于并行GC的线程数。
JDK11:引入革命性的 ZGC
ZGC是一个并发、基于region、压缩型的垃圾收集器。
JDK12:可中断的 G1 Mixed GC
JDK12:增强G1,自动返回未用堆内存给操作系统
JDK12:Shenandoah GC:低停顿时间的G,旨在针对 JVM 上的内存收回实现低停顿的需求。
Shenandoah 垃圾回收器的暂停时间与堆大小无关
JDK13:ZGC:将未使用的堆内存归还给操作系统
JDK15:Shenandoah垃圾回收算法转正
JDK15:ZGC 功能转正
ZGC是Java 11引入的新的垃圾收集器,经过了多个实验阶段,自此终于成为正式特性。
JDK16:ZGC 并发线程处理
在线程的堆栈处理过程中,总有一个制约因素就是safepoints。在safepoints这个点,Java的线程是要暂停执行的,从而限制了GC的效率。
而ZGC的并发线程堆栈处理可以保证Java线程可以在GC safepoints的同时可以并发执行。它有助于提高所开发的Java软件应用程序的性能和效率。