【基础】JDK新特性
admin
2024-03-18 21:56:10
0

一.JDK新特性

JDK9新特性(2017年9月)

  • 模块化
  • 提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法
  • 接口支持私有方法
  • Optional 类改进
  • 多版本兼容Jar包
  • JShell工具
  • try-with-resources的改进
  • Stream API的改进
  • 设置G1为JVM默认垃圾收集器
  • 支持http2.0和websocket的API

重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器。

JDK10新特性(2018年3月)

  • 局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型
  • 不可变集合的改进
  • 并行全垃圾回收器 G1,来优化G1的延迟
  • 线程本地握手,允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程
  • Optional新增orElseThrow()方法
  • 类数据共享
  • Unicode 语言标签扩展
  • 根证书

重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间。

JDK11新特性(2018年9月)(LTS版本)

  • 增加一些字符串处理方法
  • 用于 Lambda 参数的局部变量语法
  • Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
  • 可运行单一Java源码文件,如:java Test.java
  • ZGC:可伸缩低延迟垃圾收集器,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)
  • 支持 TLS 1.3 协议
  • Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
  • 对Stream、Optional、集合API进行增强

重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器。

JDK12新特性(2019年3月)

  • Switch 表达式扩展,可以有返回值
  • 新增NumberFormat对复杂数字的格式化
  • 字符串支持transform、indent操作
  • 新增方法Files.mismatch(Path, Path)
  • Teeing Collector
  • 支持unicode 11
  • Shenandoah GC,新增的GC算法
  • G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率

重要特性:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法。

JDK13新特性(2019年9月)

  • Switch 表达式扩展,switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break
  • 文本块升级 “”" ,引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符
  • SocketAPI 重构,Socket的底层实现优化,引入了NIO
  • FileSystems.newFileSystem新方法
  • ZGC优化,增强 ZGC 释放未使用内存,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统

重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO。

JDK14新特性(2020年3月)

  • instanceof模式匹配,instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量
  • 引入Record类型,类似于Lombok 的@Data注解,可以向Lombok一样自动生成构造器、equals、getter等方法;
  • Switch 表达式-标准化
  • 改进 NullPointerExceptions提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
  • 删除 CMS 垃圾回收器

JDK15新特性(2020年9月)

  • EdDSA 数字签名算法
  • Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用
  • Hidden Classes(隐藏类)
  • 移除 Nashorn JavaScript引擎
  • 改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现

JDK16新特性(2021年3月)

  • 允许在 JDK C ++源代码中使用 C ++ 14功能
  • ZGC性能优化,去掉ZGC线程堆栈处理从安全点到并发阶段
  • 增加 Unix 域套接字通道
  • 弹性元空间能力
  • 提供用于打包独立 Java 应用程序的 jpackage 工具

JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入,如instanceof模式匹配(Pattern matching)、record的引入等最终到JDK16变成了final版本。

JDK17新特性(2021年9月)(LTS版本)

  • Free Java License
  • JDK 17 将取代 JDK 11 成为下一个长期支持版本
  • Spring 6 和 Spring Boot 3需要JDK17
  • 移除实验性的 AOT 和 JIT 编译器
  • 恢复始终执行严格模式 (Always-Strict) 的浮点定义
  • 正式引入密封类sealed class,限制抽象类的实现
  • 统一日志异步刷新,先将日志写入缓存,然后再异步刷新

虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善。

二.重要特性讲解

1.模块化

**模块化的目的,是让jdk的各个组件可以被分拆,复用和替换重写,**比如对java的gui不满意,可以自己实现一个gui,对java的语法不满意,可以把javac替换成其他语言和其他语言的编译器,比如kotlin和kotlinc等,没有模块化,几乎很难实现,每次修改某个模块,总不能把整个jdk给重新编译一遍,再发布一个整个sdk吧,模块化可以帮助更有效的定制化和部署

2.变量类型推断

在Java 10中,提供了本地变量类型推断的功能,可以通过var声明变量:

var value = new MyObject();

3.HTTP客户端API

作为JDK11中正式推出的新Http连接器,支持的功能还是比较新的,主要的特性有:

  • 完整支持HTTP 2.0 或者HTTP 1.1
  • 支持 HTTPS/TLS
  • 有简单的阻塞使用方法
  • 支持异步发送,异步时间通知
  • 支持WebSocket
  • 支持响应式流

4.语法糖

Stream API 改进

Collectors.teeing()

teeing 收集器已公开为静态方法Collectors::teeing。该收集器将其输入转发给其他两个收集器,然后将它们的结果使用函数合并

List list = Arrays.asList(new Student("唐一", 55),new Student("唐二", 60),new Student("唐三", 90));//平均分 总分
String result = list.stream().collect(Collectors.teeing(Collectors.averagingInt(Student::getScore),Collectors.summingInt(Student::getScore),(s1, s2) -> s1 + ":" + s2));//最低分  最高分
String result2 = list.stream().collect(Collectors.teeing(Collectors.minBy(Comparator.comparing(Student::getScore)),Collectors.maxBy(Comparator.comparing(Student::getScore)),(s1, s2) -> s1.orElseThrow() + ":" + s2.orElseThrow()
));System.out.println(result);
System.out.println(result2);

添加Stream.toList方法(jdk16)

List list = Arrays.asList("1", "2", "3");
//之前这样写
List oneList = list.stream().map(Integer::parseInt).collect(Collectors.toList());
//现在可以这样写
List twoList = list.stream().map(Integer::parseInt).toList();

Switch表达式改进

支持箭头表达式(jdk12预览 jdk14标准)

此更改扩展了switch 语句以便它可以用作语句或表达式。不必为break每个 case 块定义一个语句,我们可以简单地使用箭头语法。

boolean isWeekend = switch (day) {case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false; case SATURDAY, SUNDAY -> true;default -> throw new IllegalStateException("Illegal day entry :: " + day);
};int size = 3;
String cn = switch (size) {case 1 -> "壹";case 2 -> "贰";case 3, 4 -> "叁";default -> "未知";
};
System.out.println(cn);

yield关键字(jdk13)

使用yield,我们现在可以有效地从 switch 表达式返回值,并能够更容易实现策略模式。

return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。

yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束

public class SwitchTest {public static void main(String[] args) {var me = 4;var operation = "平方";var result = switch (operation) {case "加倍" -> {yield me * 2;}case "平方" -> {yield me * me;}default -> me;};System.out.println(result);}
}

例子:

  def foo():print("starting...")while True:res = yield 4print("res:",res)g = foo()print(next(g))print("*"*20)print(next(g))
 starting...4********************res: None4

1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)

2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环

3.程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果,

4.程序执行print("*"20),输出20个

5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,

6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.

字符串

文本块改进(jdk13)

早些时候,为了在我们的代码中嵌入 JSON,我们将其声明为字符串文字:

String json  = "{\r\n" + "\"name\" : \"lingli\",\r\n" + "\"website\" : \"https://www.alibaba.com/\"\r\n" + "}";

现在让我们使用字符串文本块编写相同的 JSON :

String json = """ {         "name" : "Baeldung",        "website" : "https://www.alibaba.com/" 
} """;

很明显,不需要转义双引号或添加回车。通过使用文本块,嵌入的 JSON 更易于编写,更易于阅读和维护。

5.JVM

JDK9: 设置G1为JVM默认垃圾收集器

JDK10:并行全垃圾回收器 G1,通过并行Full GC, 改善G1的延迟。目前对G1的full GC的实现采用了单线程-清除-压缩算法。JDK10开始使用并行化-清除-压缩算法。

JDK11:推出ZGC新一代垃圾回收器(实验性),目标是GC暂停时间不会超过10ms,既能处理几百兆的小堆,也能处理几个T的大堆。

JDK14 :删除CMS垃圾回收器;弃用 ParallelScavenge + SerialOld GC 的垃圾回收算法组合;将 zgc 垃圾回收器移植到 macOS 和 windows 平台

JDk 15 : ZGC (JEP 377) 和Shenandoah (JEP 379) 不再是实验性功能。默认的 GC 仍然是G1

JDK16:增强ZGC,ZGC获得了 46个增强功能 和25个错误修复,控制stw时间不超过10毫秒

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...