JDK17新特性详解

原创
09/14 09:28
阅读数 3W

      JDK17新特性详解,2021-09-14正式发布

      JDK16新特性详解,2021-03-17正式发布 

      JDK15新特性详解,2020-09-15正式发布 

      JDK14新特性详解,2020-03-17正式发布  

      JDK13新特性详解,2019-09-17正式发布

      JDK12新特性详解,2019-03-19正式发布

      JDK11新特性详解,2018-09-25正式发布

      JDK10新特性详解,2018-03-20正式发布

      JDK9 新特性详解,2017-09-21正式发布

      JDK8 新特性详解,2014-03-18正式发布

      预览版:该功能在当前版本可以使用,如果效果不是很好的话,可能以后的其他版本就会删去该功能。

      最终版:该功能在之前版本效果很好,之后的每个版本中都会存在该功能。

1、switch新增模式(预览版)

      使用 switch 表达式和语句的模式匹配以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 允许针对多个模式测试表达式,每个模式都有特定的操作,以便可以简洁安全地表达复杂的面向数据的查询。基于JDK16 instanceof模式匹配(最终版)优化升级switch使用方法,先回忆下JDK16模式匹配(最终版)

if (obj instanceof String s) {   // 直接使用 s拼接字符串
   s += "heihei"; 
} else if (obj instanceof Integer i){
   // 直接使用i进行整型逻辑运算
   i += 1;
}

switch可直接用instanceof模式匹配选择(需要提前考虑null判断)

Object o;
switch (o) {
    case null      -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");
    case String s  -> System.out.println("判断是否为字符串,s:" + s);
    case record p  -> System.out.println("判断是否为Record类型: " + p.toString());
    case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + ia.length);
    case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);
    case Student s   -> System.out.println("判断是否为具体学生对象,student:" + s.toString());
    case UserCommonService -> System.out.println("判断是否为普通用户实现类,然后走普通用户逻辑");
    case UserVipService    -> System.out.println("判断是否为vip用户实现类,然后走vip用户逻辑");
    default   -> System.out.println("Something else");
}

2、Realed class密封类(最终版)

密封类和接口限制哪些其他类或接口可以扩展或实现它们。

public sealed interface Shape{
    final class Planet implements Shape {}
    final class Star   implements Shape {}
    final class Comet  implements Shape {}
}
public abstract sealed class Test{
    final class A extends Test {}
    final class B extends Test {}
    final class C extends Test {}
}

3、随机数增强

为伪随机数生成器 (PRNG) 提供新的接口类型和实现,包括可跳转的 PRNG 和额外的一类可拆分 PRNG 算法 (LXM)

4、浮点运算更加严格

简化数字敏感库开发,包括java.lang.Math和java.lang.StrictMath(对开发无实际意义)

5、Parallel GC 默认启用

Parallel GC 默认启用自适应并行处理,并行GC确定java.lang.ref.Reference在垃圾收集期间用于处理实例的最佳线程数。

默认-XX:ParallelRedProcEnabled: true。在有多个线程可用于垃圾收集的机器上,明显改善了垃圾收集暂停的阶段,如果遇到垃圾收集暂停增加的情况,可以通过-XX:ParallelRedProcEnabled在命令行上指定到原始行为

6、增强TreeMap

      增强JDK-8176894(TreeMap 没有对 putIfAbsent()computeIfAbsent()computeIfPresent()compute() 方法的专门实现。默认实现经常导致两次树遍历,这会损害性能

7、弃用Socket实现工厂机制

弃用并最终删除用于为java.net 包中的套接字类型静态配置系统范围工厂  API

具体如下: 

 * 方法: 
static void ServerSocket.setSocketFactory (SocketImplFactory fac) 
static void Socket.setSocketImplFactory (SocketImplFactory fac) 
static void DatagramSocket.setDatagramSocketImplFactory (DatagramSocketImplFactory fac) 

 * Types 
java. net SocketImplFactory 
java.net DatagramSocketImplFactory 

也可以弃用java.net SocketImplFactory 和 DatagramSocketImplFactory 类型 ,因为它们的唯一用途与上述工厂有关 设置方法。

8、统一日志支持异步日志刷新

为了避免在使用统一日志的线程中出现不希望的延迟,用户现在可以请求统一日志系统以异步模式运行。通过传递命令行选项来完成的-Xlog:async。在异步日志模式下,日志站点将所有日志消息排入缓冲区。独立线程负责将它们刷新到相应的输出。中间缓冲区是有界的。缓冲区耗尽时,将丢弃排队消息。可以使用命令行选项控制中间缓冲区的大小-XX:AsyncLogBufferSize=<bytes>

9、新增 java.time.InstantSource

java.time.InstantSource引入了一个新界面。这个接口是一个抽象java.time.Clock,只关注当前时刻,不涉及时区。

10、javadoc工具

新的“新 API”页面和改进的“弃用”页面,JavaDoc 现在可以生成一个页面,总结最近 API 的变化。要包含的最新版本列表是使用--since命令行选项指定的。这些值用于查找@since要包含在新页面上的具有匹配标签的声明。该--since-label命令行选项提供了“新API”页面的标题文本使用。

参考JDK-8263468

 

展开阅读全文
打赏
5
67 收藏
分享
加载中
一键三连
09/16 16:47
回复
举报
收藏
09/16 09:18
回复
举报
"JDK15新特性详解,2020-09-15正式发布 "
09/15 16:05
回复
举报
怎么说呢 铁汁
09/15 15:54
回复
举报
这篇文章最遗憾的地方就是漏了最劲爆的那个变更.我来补上吧, Note: In the event of a discrepancy between any part of this FAQ and the license under which you receive Oracle software, the latter shall be considered correct. This FAQ pertains to Oracle Java SE releases starting April 16, 2019 and has been updated to reflect the new Oracle No-Fee Terms and Conditions License available for Oracle Java 17 and later starting September 14, 2021.

https://www.oracle.com/nl/java/technologies/javase/jdk-faqs.html
09/15 15:42
回复
举报
来翻译翻译什么叫TM的No-Fee!?
09/15 16:00
回复
举报
还不错
09/15 13:59
回复
举报
没有多少新特性啊,为什么这一版本是 LTS 呢?
09/15 10:24
回复
举报
从11之后,12,13,14,15,16,17的所有东西都加进去,才是JDK17 LTS的内容,相当于之前的都是测试版本
09/15 13:57
回复
举报
这是长期支持版,实验性的东西更少,稳定性的东西更多。
09/16 12:56
回复
举报
明明从Java9开始就在狂删东西,尤其是Java11删了一大堆,而很少新加东西,大部分是在改进
09/15 09:49
回复
举报
java越来越复杂
09/15 09:31
回复
举报
jdk8永远的神
09/15 09:23
回复
举报
更多评论
打赏
30 评论
67 收藏
5
分享
返回顶部
顶部