JDK17 与 JDK11 特性差异浅谈( 三 )


Shenandoah 是以实验特性在 JDK12 中引入的 。在 JDK15 中正式上线 。
使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200MB 还是 200GB ,都将具有相同的一致暂停时间 。与 ZGC 类似 , Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等 。
ZGC 和 ShenandoahGC 的一些主要区别:

  1. 设计目标:ZGC 和 ShenandoahGC 都是为了实现低延迟的垃圾收集而设计的 。
  2. 并发回收:ShenandoahGC 实现了并发回收,这意味着它可以在应用线程运行的同时进行垃圾收集,从而减少了垃圾收集对应用性能的影响 。
  3. 内存管理:ShenandoahGC 使用名为“连接矩阵”的全局数据结构来记录跨 Region 的引用关系,降低了处理跨代指针时的记忆集维护消耗 。而 ZGC 的 Region 可以动态创建和销毁 , 容量也可以动态调整 。
  4. 开发者:Shenandoah 由 RedHat 开发 , 而 ZGC 由 Oracle 开发 。
使用方法:要启用/使用 Shenandoah GC , 需要以下 JVM 选项: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC 。作为实验性功能,Shenandoah 构建系统会自动禁用不受支持的配置 。
1.6 String 新增方法
  1. transform(Function):对字符串进行处理后返回 。
var rs = "test".transform(s -> s + "Java").transform(s -> s.toUpperCase()); // TESTJAVA
  1. indent:该方法允许我们调整String实例的缩进 。
String result = "Javanjavantest".indent(3);/*结果会缩进三格Javajavatest*/1.7 Files 新增 mismatch 方法返回内容第一次不匹配的字符位置索引 。
System.out.println(Files.mismatch(Path.of("a.txt"),Path.of("b.txt")));1.8 核心库 java.text 支持压缩数字格式NumberFormat 添加了对 ”紧凑形式格式化数字“ 的支持 。
”紧凑数字格式“是指以简短或人类可读形式表示的数字 。
例如,在 en_US 语言环境中 , 1000 可以格式化为 “ 1K ”,1000000 可以格式化为 “ 1M ”,具体取决于指定的样式 NumberFormat.Style。紧凑数字格式由 LDML 的 Compact Number 格式规范定义 。要获取实例,请使用 NumberFormat 紧凑数字格式所给出的工厂方法之一 。
NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);String result = fmt.format(1000);//1Kvar cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA,NumberFormat.Style.SHORT);System.out.println(cnf.format(5_0000));//"5万"System.out.println(cnf.format(7_9200));//"7.9万"System.out.println(cnf.format(8_000_000));//"800万"System.out.println(cnf.format(9L << 30));//"96亿"System.out.println(cnf.format(6L << 50));//"5637142兆"System.out.println(cnf.format(6L << 60));//"6917529京"1.9 JDK17 支持到 Unicode13JDK12 支持 Unicode11.0
【JDK17 与 JDK11 特性差异浅谈】JDK13 支持 Unicode12.1
从 JDK14 到 JDK17 均是支持 Unicode13.0
1.10 NullPointerExceptions 升级JDK14 之前,从报错中我们只能得到错误出现的行数 , 但在 JDK14 之后 , 会清晰的告诉你哪个对象空指针了 。
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.charAt(int)" because "str" is nullat com.qf.jdk14.Test.main(Test.java:11)1.11 文本块特性背景:在 Java 中,在字符串文字中嵌入 html ,XML,SQL 或 JSON 片段通常需要先进行转义和串联的大量编辑,然后才能编译包含该片段的代码 。该代码段通常难以阅读且难以维护 。
Java 的文本块特性是在 JDK15 中正式实现的 。这个特性首先在 JDK13 中以预览版的形式发布,然后在 JDK14 中改进并再次以预览版的形式发布 。这一特性提高了 Java 程序书写大段字符串文本的可读性和方便性 。
文本块的开头定界符是由三个双引号 """ 开始,从新的一行开始字符串的内容 , 以 """ 结束 。如果结束的 """ 另起一行时,字符串内容最后会留有一新行 。
使用案例String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`n" +"WHERE `CITY` = 'INDIANAPOLIS'n" +"ORDER BY `ID`, `LAST_NAME`;";//使用文本块语法String query = """SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`WHERE `CITY` = 'INDIANAPOLIS'ORDER BY `EMP_ID`, `LAST_NAME`;""";


推荐阅读