JDK8、JDK11、JDK17
之前项目开发一直使用JDK8
,最近碰到IDEA插件在IDEA 2022.2
以上版本报错的问题后,把自己的IDEA升级到2022.2,发现2022.2版本的IDEA默认JDK17。
把插件基础intellij环境升级到2022.2,必须要JDK17才能编译通过,同时Gradle要求7以上。
于是,想要对于JDK的不同版本进行一些了解。
LTS,是 Long Term Support,也就是官方保证会长期支持的版本。
https://blog.csdn.net/java_wxid/article/details/131333918
JDK8
1、Lambda表达式
2、接口增强
- 在1.8之前,接口中只能有:静态常量,抽象方法
- 在1.8之后,接口中可以有:静态常量,抽象方法,默认方法,静态方法
默认方法可以被继承和重写。
静态方法只能通过接口.方法名
调用,不能被继承和重写。
3、函数式接口
- Supplier
- Consumer
- Function
- Predicate
4、Stream API
5、Optional类
Optional 类是一个可以为null的容器对象。
如果值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional对象的创建方式
- ofNullable:允许一个可能为空的对象
- of:需要一个不为空的对象
Optional常用方法
- empty:可以创建一个空的Optional对象
- get:直接获取Optional内部对象,但是不建议单独使用
- isPresent:判断内部对象是否为空,返回一个布尔值
- ifPresent:一样判断内部对象是否为空,如果不为空会执行lambda表达式
- filter:通过一定条件过滤对象
- flatMap:和map的区别为lambda入参的对象封装入了Optional
- orElse:如果值为空,返回一个对象
- orElseGet:如果值为空,执行一段lambda并返回一个对象
- orElseThrow:如果值为空,抛出一个异常
6、新时间日期API
JDK8中新增加了一套全新的日期时间API,这套API设计合理,并且是线程安全的。
API位于java.time包下:
- LocalDate:表示日期,包含年月日,格式为2020-01-11。
- LocalTime:表示时间,包含时分秒,格式为11:07:03.580。
- LocalDateTime:表示日期和时间组合,包含年月日,时分秒,格式为2020-01-11T11:07:03.580
- DateTimeFormatter:日期时间格式化类
- Instant:时间戳,表示一个特定的时间瞬间
- Duration:用于计算两个时间(LocalTime,时分秒)的距离
- Period:用于计算2个日期(LocalDate,年月日)的距离
- ZoneDateTime:包含时区的时间
7、Base64 工具
Java 8 内置了 Base64 编码的编码器和解码器
8、JVM的PermGen方法区被移除,取代它的是Metaspace(JEP 122)元空间
为什么要使用元空间替代永久代?
Java 官方在 JEP 122: Remove the Permanent Generation(移除永久代)中给出了答案,原文内容如下:
Motivation(动机) This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.
这是 JRockit 虚拟机和 HotSpot 虚拟机融合工作的一部分。JRockit 客户不需要配置永久层代(因为 JRockit 没有永久代),所以要移除永久代。
之所以,使用元空间替代永久代,主要是因为官方需要将 HotSpot 虚拟机和 JRockit 融合,而 JRockit 虚拟机不存在永久代的概念,所以要去掉永久代的概念,除此之外使用元空间还可以提高稳定性、降低 OOM 以及节省运维成本。
9、CompletableFuture
在 Java8 之前 Future 接口提供了异步执行任务的能力,但对于结果的获取只能通过阻塞或者轮询的方式。
为了增强异步编程的功能,Java8 添加了 CompletableFuture 类,CompletableFuture 类实现了 CompletionStage 和 Future 接口,默认使用 ForkJoinPool.commonPool() 线程池。
JDK11
1、JVM ZGC垃圾收集器
ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为”Stop the world”。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)
2、变量类型推断
从 Java10 开始变量不需要写具体类型,变量类型直接使用 var 定义,编译器能根据右边的表达式自动推断类型。
3、官方HTTP Client
Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化。
Java 11 中的新 Http Client API,提供了对 HTTP/2 等业界前沿标准的支持,同时也向下兼容 HTTP/1.1,精简而又友好的 API 接口,与主流开源 API(如:Apache HttpClient、Jetty、OkHttp 等)类似甚至拥有更高的性能。
4、接口允许有私有方法
5、try语句
1 |
|
6、I/O流新特性
类 java.io.InputStream
中增加了新的方法来读取和复制 InputStream 中包含的数据。
- readAllBytes:读取 InputStream 中的所有剩余字节。
- readNBytes: 从 InputStream 中读取指定数量的字节到数组中。
- transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中。
JDK17
- SpringBoot 3.0最低版本要求的JDK 17
- JetBrains:Intelij项目的源代码迁移到了Java 17