之前项目开发一直使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void tryTest() {
String path = "/home/nathan/test.sh";
//Java7 引入的 try-with-resource 机制
try (var reader = new InputStreamReader(System.in)) {
} catch (IOException e) {
e.printStackTrace();
}

//Java9 可以在 try 中使用已初始化的资源
var reader = new InputStreamReader(System.in);
var writer = new OutputStreamWriter(System.out);
try (reader; writer) {
//reader是final的,不可再被赋值
} catch (IOException e) {
e.printStackTrace();
}
}

6、I/O流新特性

java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据。

  • readAllBytes:读取 InputStream 中的所有剩余字节。
  • readNBytes: 从 InputStream 中读取指定数量的字节到数组中。
  • transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中。

JDK17

  • SpringBoot 3.0最低版本要求的JDK 17
  • JetBrains:Intelij项目的源代码迁移到了Java 17