跳到主要内容

Java

一种使用非常广泛的跨平台编程语言。

一些官方网站

从 JDK 8 到 JDK 17 的新特性

JDK 8 新特性(2014 年 3 月)

  • Lambda 表达式:Lambda 表达式是 JDK 8 中最重要的新特性之一。它允许我们以一种更简洁和函数式的方式编写代码。通过 Lambda 表达式,我们可以将函数作为参数传递给其他方法,从而实现更加灵活的编程。Lambda 表达式使得代码更易读、易写,并且可以提升代码的可维护性。
  • Stream API:Stream API 是 JDK 8 中引入的一套用于处理集合和数组的新 API。它提供了一种流式处理的方式,可以更方便地对数据进行操作和处理。Stream API 支持并行处理,可以提高程序的执行效率。通过使用 Stream API,我们可以更简单地实现过滤、映射、归约等操作,并且可以以更优雅的方式处理集合数据。
  • 函数式接口:JDK 8 引入了函数式接口的概念。函数式接口是只包含一个抽象方法的接口,它可以用作 Lambda 表达式的类型。函数式接口可以通过@FunctionalInterface 注解来标记,以确保它只包含一个抽象方法。函数式接口的引入使得 Java 支持函数式编程,可以更方便地使用 Lambda 表达式。
  • 默认方法:在 JDK 8 之前,接口只能包含抽象方法和常量。JDK 8 引入了默认方法的概念,可以在接口中实现方法的默认实现。默认方法可以在接口中提供一个默认的实现,从而避免因为接口的改变而导致实现类需要进行修改。默认方法使得接口可以更灵活地扩展,同时保持向后兼容性。
  • 方法引用:方法引用是一种更简洁地表示 Lambda 表达式的方式。它允许我们直接引用已经存在的方法,而不是通过 Lambda 表达式来实现。方法引用可以提高代码的可读性和可维护性,同时减少重复代码的编写。
  • 新的日期和时间 API:JDK 8 引入了一套全新的日期和时间 API,用于替代旧的 Date 和 Calendar 类。新的日期和时间 API 更加简单易用,并且提供了更多的功能。它支持日期、时间、时区、时间间隔等的处理,同时提供了更多的操作方法和格式化选项。
  • 并发增强:JDK 8 对并发编程进行了增强。它引入了一些新的并发工具和类,使得并发编程更加容易和有效。其中包括 CompletableFuture 类、StampedLock 类、并行数组等。这些增强使得开发人员能够更好地处理并发问题,提高程序的性能和可伸缩性。
  • 其他改进:除了以上提到的主要新特性外,JDK 8 还引入了许多其他的改进,包括改进的类型推断、重复注解、新的编译器 API 等。这些改进使得 Java 语言更加现代化和强大,提供了更多的编程选项和灵活性。

JDK 9 新特性(2017 年 9 月)

  • 模块化
  • 提供了 List.of()、Set.of()、Map.of() 和 Map.ofEntries() 等工厂方法
  • 接口支持私有方法
  • Optional 类改进
  • 多版本兼容 Jar 包
  • JShell 工具
  • try-with-resources 的改进
  • Stream API 的改进
  • 设置 G1 为 JVM 默认垃圾收集器
  • 支持 HTTP 2.0 和 WebSocket 的 API 重要特性:API 的优化,如支持 HTTP 2 的 Client API、JVM 采用 G1 为默认垃圾收集器。

JDK 10 新特性(2018 年 3 月)

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

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

JDK 11 新特性(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 进行增强

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

JDK 12 新特性(2019 年 3 月)

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

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

JDK 13 新特性(2019 年 9 月)

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

JDK 14 新特性(2020 年 3 月)

  • instanceof 模式匹配,instanceof 类型匹配语法简化,可以直接给对象赋值,如 if(obj instanceof String str),如果 obj 是字符串类型则直接赋值给了 str 变量
  • 引入 Record 类型,类似于 Lombok 的 @Data 注解,可以向 Lombok 一样自动生成构造器、equals、getter 等方法
  • Switch 表达式-标准化
  • 改进 NullPointerExceptions 提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查
  • 删除 CMS 垃圾回收器
  • JDK 15 新特性(2020 年 9 月)
  • EdDSA 数字签名算法
  • Sealed Classes(封闭类,预览),通过 sealed 关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用
  • Hidden Classes(隐藏类)
  • 移除 Nashorn JavaScript 引擎
  • 改进 java.net.DatagramSocket 和 java.net.MulticastSocket 底层实现

JDK 16 新特性(2021 年 3 月)

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

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

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

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

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

JDK 21 新特性(2023 年 9 月)

  • 字符串模板,可以像其他语言那样子方便的做字符串拼接,是+号,StringBuilder,MessageFormat 之外更方便的字符串拼接方法。 注意:这个特性虽然还在预览阶段,还不属于正式发布,但是若能最终进入发布,能够大大减轻了 Java 编程时复杂字符串的编辑处理工作量。
  • 引入新的接口来表示具有定义相遇顺序的集合。每个这样的集合都有定义明确的第一个元素、第二个元素,以此类推,直到最后一个元素。它还提供了统一的应用程序接口,用于访问其第一个和最后一个元素,以及以相反的顺序处理其元素。
  • 通过扩展 Z 垃圾收集器(ZGC),为新旧对象分别保留不同的世代,从而提高应用程序的性能。这将允许 ZGC 更频繁地收集年轻代的对象(对象往往频繁地英年早逝)。
  • 使用记录模式来解构记录值,从而增强 Java 编程语言的功能。记录模式和类型模式可以嵌套,以实现强大、声明性和可组合的数据导航和处理形式。
  • 用模式匹配来增强 Java 编程语言的开关表达式和语句。将模式匹配扩展到开关后,表达式就可以根据多个模式(每个模式都有特定的操作)进行测试,从而可以简洁安全地表达面向数据的复杂查询。
  • 引入一个应用程序接口(API),使 Java 程序能够与 Java 运行时之外的代码和数据互操作。通过高效地调用外来函数(即 JVM 之外的代码)和安全地访问外来内存(即 JVM 管理之外的内存),- API 使 Java 程序能够调用本地库和处理本地数据,而不会出现 JNI 的脆性和危险。这是一个预览版 API。
  • 使用未命名模式和未命名变量来增强 Java 语言的功能。未命名模式用于匹配记录组件,但不说明该组件的名称或类型;未命名变量用于初始化但不使用。两者都用下划线字符 _ 表示。这是一项预览语言功能。
  • 将虚拟线程引入 Java 平台。虚拟线程是一种轻量级线程,可大大减少编写、维护和观察高吞吐量并发应用程序的工作量。
  • 引入密钥封装机制(KEM)的 API 接口,这是一种使用公钥加密法确保对称密钥安全的加密技术。
  • 通过引入结构化并发 API 来简化并发编程。结构化并发将在不同线程中运行的一组相关任务视为一个工作单元,从而简化了错误处理和取消,提高了可靠性并增强了可观察性。这是一个预览版 API。