1.字符串API增强
1. isBank() 判断是否为空字符串 或者 trim()之后是否为空字符串
String blankStr = " ";
// true
boolean trueVal = blankStr.isBlank();
2. lines() 符串按照行终止符(换行符\n或者回车符\r)进行分割,并将分割为Stream流
String newStr = "Hello Java 11 \n felord.cn \r 2021-09-28";
Stream<String> lines = newStr.lines();
lines.forEach(System.out::println);
3. strip() 去除字符串前后的“全角和半角”空白字符
String str = "HELLO\u3000";
// str = 6
System.out.println("str = " + str.length());
// trim = 6
System.out.println("trim = " + str.trim().length());
// strip = 5
System.out.println("strip = " + str.strip().length());
从上面也看出来了差别,trim()只能去除半角空白符。
strip()方法还有两个变种,
stripLeading()用来去除前面的全角半角空白符;
stripTrailing()用来去除尾部的全角半角空白符。
4.repeat(n)按照给定的次数重复串联字符串的内容:
String str = "HELLO"
// 空字符
String empty = str.repeat(0);
// HELLO
String repeatOne = str.repeat(1);
// HELLOHELLO
String repeatTwo = str.repeat(2);
2.集合转对应的数组
List<String> sampleList = Arrays.asList("张三", "java 11");
// array = {"张三", "java 11"};
String[] array = sampleList.toArray(String[]::new);
3. var 修饰lambda局部变量
4. 断言取反
List<String> sampleList = Arrays.asList("张三", "java 11","jack");
List<String> result = sampleList.stream()
// 过滤以j开头的字符串
// var 修饰lambda局部变量
.filter((@NotNull var s) -> s.startsWith("j"))
// 同时不包含11的字符串 断言取反
.filter(Predicate.not((@NotNull var s) -> s.contains("11")))
.collect(Collectors.toList());
5.Stream 数据流新方法
1.ofNullable() 单个元素构造流
int count = Stream.ofNullable(null).count(); // 0
2.of() 单个元素构造流 // {1,2,3}
List<Integer> list = Stream.of(1,2,3)..collect(Collectors.toList());
3.dropWhile() 判断放弃哪个元素
Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1]
4.takeWhile() 判断选用哪个元素
Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]
6.Optional 新方法
// 你现在可以简单地将 Optionals 转换为流,或者提供另一个 Optionals 作为空 Optionals 的回调
Optional.of("foo").orElseThrow(); // foo
Optional.of("foo").stream().count(); // 1
Optional.ofNullable(null)
.or(() -> Optional.of("fallback"))
.get();
7.Epsilon垃圾收集器
简介:(A No-Op Garbage Collector)垃圾回收器控制内存分配,但是不执行任何垃圾回收工作。一旦java的堆被耗尽,jvm就直接关闭。设计的目的是提供一个完全消极的GC实现,分配有限的内存分配,最大限度降低消费内存占用量和内存吞吐时的延迟时间。一个好的实现是隔离代码变化,不影响其他GC,最小限度的改变其他的JVM代码。
用法:VM options选项中配置 -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
示例:
package com.xz.jdk11.day1;
import java.util.ArrayList;
import java.util.List;
/**
* @description:
* @author: xz
*/
public class EpsilonTest {
public static void main(String[] args) {
boolean flag = true;
List<Garbage> list = new ArrayList<>();
long count = 0;
while (flag) {
list.add(new Garbage());
if (count++ ==100) {
list.clear();
count++;
}
}
System.out.println("程序结束");
}
}
class Garbage {
//这个方法是GC再清除本对象时,会调用一次
@Override
public void finalize() {
System.out.println(this + "垃圾收集");
}
}
结果:使用选项 -XX:+UseEpsilonGC, 程序很快就因为堆空间不足而退出
原因:提供完全被动的GC实现,,具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量。java实现可广泛选择高度可配置的GC实现。各种可用的收集器最终满足不同的需求,,即使它们的可配置性使它们的功能相交。 有时更容易维护单独的实现,,而不是在现有GC实现上堆积另一个配置选项。
用途:
1.性能测试(它可以帮助过滤掉GC引起的性能假象)
2.内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃)
3.非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间)
4.VM接口测试
5.Last-drop 延迟&吞吐改进
原文链接:https://blog.csdn.net/li1325169021/article/details/128388110
8.ZGC垃圾回收器
ZGC垃圾回收器
据说这是JDK11最为瞩目的特性,没有之一,是最重磅的升级,那么ZGC的优势在哪里呢?
1.GC暂停时间不会超过10毫秒
2.既能处理几百兆的小堆,也能处理几个T的大堆
3.和G1相比,应用吞吐能力不会下降超过15%
4.为未来的GC功能和利用colord指针以及Load barriers优化奠定了基础
ZGC是一个并发、基于region、压缩型的垃圾收集器,只有root扫描阶段会STW(strop the world,停止所有线程),因此ZGC的停顿时间不会随着堆的增长和存活对象的增长而变长。用法:-XX:UnlockExperimentalVMOptions -XX:+UseZGC虽然功能如此强大,但很遗憾的是,在Windows系统的JDK中并没有提供ZGC,所以也就没有办法测试了