Java:版本演进历程(7~21)

240 阅读15分钟

1,Java 7(2011年7月发布)

  • 二进制字面量:可以使用 0b 或 0B 前缀来表示二进制字面量,例如 0b1010 表示十进制的 10。
  • 数字字面量下划线:可以在数字字面量中使用下划线来增加可读性,例如 1_000_000 表示一百万。
  • switch 语句的字符串支持:可以在 switch 语句中使用字符串作为条件表达式。
  • try-with-resources 语句:可以在 try 语句中使用资源(如文件、网络连接等),在代码块结束后自动关闭资源。
  • 泛型实例化类型自动推断:可以省略泛型实例化类型的定义,编译器会自动推断类型。
  • 改进的类型推断:可以在匿名内部类、泛型实例创建、构造器等地方使用菱形操作符(<>)来省略类型参数。
  • 多个异常捕获:可以在一个catch块中捕获多个异常,使用管道符(|)分隔。
  • 数组初始化简化:可以在数组初始化时省略new关键字和数组类型,编译器会根据上下文自动推断类型。
  • G1垃圾收集器:引入 G1(Garbage-First)垃圾收集器,用于替代 CMS(Concurrent Mark Sweep)垃圾收集器。
  • 改进的异常处理:可以在 catch 块中使用 catch(Exception e) 的形式来捕获异常,并在需要时重新抛出原始异常。
  • NIO2.0:引入了NIO2.0(New Input/Output)库,提供了更强大和灵活的文件I/O操作。
  • 动态语言支持:引入了动态语言支持,可以在 Java 代码中调用动态语言(如 JavaScript、Groovy 等)。

2,Java 8(2014年3月发布)

  • Lambda表达式: ⼀种匿名函数,可以作为参数传递给方法或者在集合框架中使用,使代码更加简洁易读,为Java增加了函数式编程的能力。例如: (parameters) -> expression 或 (par ameters) -> { statements; }
  • 函数式接口:只能有⼀个抽象方法,但可以包含多个默认⽅法或静态方法,并且通常使用 @FunctionalInterface 注解标记,用于支持Lambda表达式。
  • 方法引用:是简化版的 Lambda 表达式,允许以更简洁的方式引用方法,有静态方法引用、实例方法引用、特定类型的任意对象的实例方法引用、构造器引用等类型。
  • 接口默认方法: 接口中可以定义默认实现的方法,使得接口可以包含方法的实现,解决了像接口添加新方法修改所有实现类的问题。
  • Stream API:提供了一种更高效、声明式的集合操作方式,核心思想是将数据处理操作以函数式的方式链式链接,包括过滤、映射、排序、规约等操作,而无需显示编写传统的循环代码。**
  • Date/Time API:引入了 java.time 包,用来替代旧的日期时间API,如 java.util.Date 和 java.util.Calendar,提供了更好的可读性、可操作性和可维护性。
  • Optional类:为解决空指针异常而设计的容器类,帮助开发者更优雅地处理可能为 null 的情况。
  • Nashorn JavaScript引擎:引入了 Nashorn JavaScript 引擎,可以在 Java 中直接运行 JavaScript 代码。
  • 并行数组操作:引入了新的并行数组操作,可以方便地进行并行计算。
  • 新的工具方法:引入了一些新的工具方法,如 Base64 编码解码、并行排序等。
  • PermGen空间移除:移除了永久代(PermGen空间),取而代之的是元空间(Metaspace)。
  • 并行与并发增强:对并行和并发编程进行了增强,引入了新的并行流和并行数组操作。
  • JVM性能改进:对JVM进行了性能改进,提高了程序的执行效率。

3,Java 9(2017年9月发布)

  • 模块化系统: 引入了一个全新的模块化系统,称为JPMS。它允许开发人员将代码划分为模块,每个模块有自己明确的依赖关系,使大型项目更加易于管理和维护。
  • JShell:JShell是一个交互式的Java编程环境,可以在其中直接编写和执行Java代码片段,无需编写完整的Java程序。这使得Java的学习和调试变得更加简单和方便。
  • 集合工厂方法:Java 9为集合框架添加了一些新的工厂方法,使得创建不可变集合变得更加简单和方便。包括:List.of()、Set.of()、Map.of() 和 Map.ofEntries() 等。
  • 接口支持私有方法:接口中不仅可以有公共抽象方法和公共静态方法,还可以有私有方法和私有静态方法。
  • 多版本兼容 Jar 包:同一个 Jar 文件可以包含多个 Java 平台版本的类文件,有助于库作者更好的支持不同版本的 Java。
  • 进程管理 API 增强:增强了对操作系统进程的管理,使得 Java 程序可以更好地控制和管理操作系统进程。
  • Stream API 改进:增加了 takeWhile、dropWhile 等方法。
  • Optional 类改进:增加了 ifPresentOrElse 等方法。

4,Java 10(2018年3月发布)

  • 局部变量类型推断:Java 10引入了var关键字,允许在局部变量的声明中使用类型推断,编译之后会推断出值的真实类型,从而简化代码并提高可读性。
  • 并行全垃圾回收器(Parallel Full GC):G1垃圾回收器由单线程改成多线程并行处理,它可以在全堆垃圾回收期间利用多个处理器核心,降低 G1 的停顿时间。
  • 线程本地握手(Thread-Local Handshakes):允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程。
  • Optional 新增 orElseThrow() 方法:提供了便捷的处理 Optional 值不存在时的方式。
  • 增强的并发性:Java 10引入了一些新的并发API,包括 CompletableFuture 的改进和新的线程安全的 Random 类。

5,Java 11(2018年9月发布,LTS版本)

  • HttpClient 重写:支持 HTTP/1.1和HTTP/2,也支持 WebSockets。
  • 用于 Lambda 参数的及局部变量语法:进一步优化了Lambda 表达式中局部变量的使用语法。
  • 字符串处理方法增强:增加了一些新的字符串处理方法。
  • ZGC:可伸缩低延迟垃圾收集器,是在 G1 之上更细粒度的内存管理测试。
  • 可运行当以 Java 源文件:如 java test.java。
  • 改进的安全性:Java 11引入了一些新的安全性特性,包括为 TLS 1.3 提供原生支持、增强的证书验证和更强大的加密支持。
  • 改进的工具和库:Java 11提供了一些新的工具和库,包括改进的Java Flight。 Recorder、改进的Java Mission Control、新的Unicode 10支持和新的集合工厂方法。
  • Stream、Optional、集合API增强:对这些常用的API进行了功能增强和优化。

6,Java 12(2019年3月发布)

  • Switch表达式的改进:引入了新的switch表达式,允许有返回值。这使得代码更简洁、易读,并且可以更好地处理复杂的条件逻辑。
  • 紧凑的Number格式(Compact Number Format):Java 12 引入了一种新的紧凑数字格式,用于将数字格式化为紧凑的形式,例如将 1000 表示为 "1K"。这使得数字的显示更加简洁和易读。
  • Shenandoah垃圾回收器(Shenandoah Garbage Collector):Java 12引入了一种新的垃圾回收器,称为Shenandoah垃圾回收器。该垃圾回收器使用并发技术,减少了垃圾回收期间的停顿时间,提高了应用程序的响应性能。
  • 改进的字符串操作:Java 12对字符串操作进行了改进,包括新增了一些新的方法,例如indent()方法用于缩进字符串,transform()方法用于对字符串进行转换。
  • Teeling Collector:可以将元素收集到多个不同的集合中。
  • G1收集器的优化:将GC的垃圾分为强制部分和可选部分,提高了GC的效率。

7,Java 13(2019年9月发布)

  • Switch表达式扩展:Switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break。
  • 文本块(Text Blocks):引入了文本块,可以使用 """ 三个双引号表示文本块,文本块内部不需要使用换行的转义符。
  • Socket API重构:对Socket的底层实现进行了优化,引入了NIO。可能诱发OOM
  • ZGC垃圾回收器(Z Garbage Collector):增强ZGC释放未使用内存的能力,将标记长时间空闲的堆内存空间返还给操作系统。

8,Java 14(2020年3月发布)

  • Instanceof 模式匹配:简化了 instanceof 类型匹配语法,可以直接给对象赋值。
  • 引入 Record 类型:类似于 Lombok 的 @data 注解,可以自动生成构造器、equals、getter等方法。
  • Switch表达式-标准化改进:对Switch表达式进行了标准化改进。
  • NullPointerException提示信息增强:打印具体哪个方法抛的空指针异常,方便异常排查。
  • 删除CMS垃圾回收器:不再支持CMS垃圾回收器。

9,Java 15(2020年9月发布)

  • EdDSA数字签名算法:增加了新的数字签名算法。
  • Sealed Classes(封闭类,预览):通过 sealed 关键字修饰抽象类,限定只允许指定的子类才可以实现或继承抽象类。
  • Hidden Classes(隐藏类):新增了隐藏类的特性。
  • 移除 Nashorn JavaScript 引擎:不再支持 Nashorn JavaScript 引擎。
  • 改进 java.net.Data.gramSocket 和 java.net.MulticastSocket 底层实现:优化了网络套接字的底层实现。

10,Java 16(2021年3月发布)

  • 允许JDK C++源代码中使用C++14功能: 提升了JDK在C++层面的开发能力。
  • ZGC性能优化:去掉ZGC线程堆栈处理从安全点到并发阶段的一些操作,进一步提升ZGC性能。
  • 增加Unix域套接字通道:增强了套接字 通道的功能。**
  • 弹性元空间能力:提升了元空间的弹性和可管理性。

11,Java 17(2021年9月发布,LTS)

  • 密封类转正:Sealed Classes 在 Java 15 中是预览特性,在 Java 17 中正式转正,用于限制类的继承结构。
  • 增强型伪随机数生成器:提供了更强大的伪随机数生成功能。
  • 新的 Mac OS 渲染管道:针对 Mac OS 系统的图形渲染进行了优化。
  • 外部函数和内存 API(预览):允许 Java 程序与外部代码和内存进行更高效的交互。
  • 上下文特定的反序列化过滤器:增强了反序列化的安全性。

12,Java 18(2022年3月发布)

  • 默认字符集为 UTF-8。
  • 简易的 Web 服务器:可以使用 jwebserver 命令启动一个简易的静态 Web 服务器。
  • 使用方法句柄重新实现反射核心:改进了 java.lang.reflect.MethodConstructor 的实现逻辑,使之性能更好,速度更快。
  • 向量 API:向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。
  • 互联网地址解析 SPI:Java 18 定义了一个全新的 SPI(service-provider interface),用于主要名称和地址的解析,以便 java.net.InetAddress 可以使用平台之外的第三方解析器。

13,Java 19(2022年9月发布)

  • 记录模式: 使用记录模式增强 Java 编程语言以解构记录值,可以嵌套记录模式和类型模式,实现强大的、声明性的和可组合的数据导航和处理形式。
  • Linux/RISC-V 移植: 将 JDK 移植到 Linux/RISC-V,目前仅支持 RISC-V 的 RV64GV 配置(包含向量指令的通用 64 位 ISA)。将来可能会考虑支持其他 RISC-V 配置,例如通用 32 位配置 (RV32G)。
  • 外部函数和内存 API (预览版): 引入一个 API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过该 API 可有效地调用外部函数( JVM 之外的代码)和安全地访问外部内存(不受 JVM 管理的内存),使得 Java 程序能够调用本机库并处理本机数据,而不会出现 JNI 的脆弱性和危险。
  • 虚拟线程(预览版):将虚拟线程引入 Java 平台。虚拟线程是轻量级线程,可显著地减少编写、维护和观察高吞吐量并发应用程序的工作量。
  • Vector API (第四次孵化): 引入一个 API 来表达在运行时能够可靠编译的向量计算,在支持的 CPU 架构上优化向量指令,从而实现优于标量计算的性能。
  • Switch 模式匹配(第三预览版): 用 switch 表达式和语句的模式匹配,以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 中,允许针对一些模式测试表达式,这样就可以简明而安全地表达复杂的面向数据的查询。 该特性最早在 Java 17 中作为预览版出现, Java 19 为第三次预览。
  • 结构化并发(孵化阶段): 引入用于结构化并发的 API 来简化多线程编程,结构化并发将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。 这是一个孵化阶段的 API。

14,Java 20(2023年3月发布)

  • 在 JDK 20 中,最新的向量 API 提案直到几周前才正式加入。向量 API 用来表达向量计算,在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令。这将实现优于同等标量计算的性能。向量 API 之前已经在 JDK 16、JDK 17、JDK 18 和 JDK 19 中得到了孵化,因此这一次是向量 API 进入第 5 次孵化阶段。
  • 虚拟线程(Virtual Threads) 在 JDK 20 中进入第 2 次预览阶段。它是 JDK 实现的轻量级的线程,可以减少编写、维护和观察高吞吐量并发应用程序的工作。据 Oracle 称,这种能力将从根本上改变 Java 应用的扩展方式。
  • 结构化并发 (Structured Concurrency):具有简化多线程编程的作用,并将在不同线程中运行的多个任务视为一个工作单元。简化了错误处理等功能后,提高了可靠性并增强了可观察性。自从在 JDK 19 中孵化以来,唯一的变化是,StructuredTaskScope 已经被更新,以支持在任务范围内创建的线程对范围值的继承。这个功能正在被重新孵化。
  • 作用域值(Scoped Values):处于孵化阶段的 API,可以在线程内和跨线程共享不可变的数据。与线程本地变量相比,这些变量更受欢迎,特别是在使用大量的虚拟线程时。一个作用域值允许数据在大型程序的组件之间安全有效地共享,而不需要借助方法参数。目标包括易用性、可理解性、稳健性和性能。
  • 记录模式 (Record Patterns) ,目前处于第二个预览版本,可对 record 的值进行解构,用以增强 Java 编程语言。Record patterns 和 Type patterns 可以嵌套,以实现数据导航和处理的声明性、强大和可组合的形式。目标包括扩展模式匹配以表达更复杂的、可组合的数据查询,并且不改变类型模式的语法或语义。
  • 外部函数和内存 API:它通过引入一个 API,让 Java 程序可以与 Java 运行时之外的代码和数据进行互操作。该 API 使 Java 程序能够调用本地库和处理本地数据,而不会像 JNI(Java Native Interface)那样脆弱和危险。该 API 以前在 JDK 17 和 18 版本中进行过孵化,并在 JDK 19 中进行过预览。自 JDK 19 以来增加的改进包括统一 MemorySegment 和 MemoryAddress 抽象,增强 MemoryLayout 层次结构,以及将 MemorySession 拆分为 Arena 和 SegmentScope 等。
  • Switch 语句和表达式的模式匹配:功能之前在 JDK 17、JDK 18 和 JDK 19 中进行过预览,第四次预览将实现与 Record Patterns 的持续共同演进。自第三次预览以来,switch 的模式匹配的主要变化包括简化 switch 标签的语法,以及支持 switch 语句和表达式中通用模式和记录模式的类型参数的推断。

15,Java 21(2023年9月发布,LTS版本)

  • JDK21 中对 ZGC 进行了功能扩展,增加了分代 GC 功能。 分代 ZGC 可以显著减少垃圾回收过程中的停顿时间,提高了垃圾回收效率和内存利用率,并提高应用程序的响应性能。
  • 记录模式:增强了模式匹配功能,允许在switch表达式和语句中使用记录模式,更方便地对复杂数据结构进行解构和匹配。
  • 密封接口:与密封类类似,密封接口限制了哪些类可以实现该接口,有助于更好地设计和组织代码结构。
  • 动态调用方法句柄:增强了方法句柄的功能,使其能够更灵活地动态调用方法,支持更多的调用模式和参数类型。
  • 虚拟线程转正:一种轻量级线程实现,可显著提高引用程序的可伸缩性和性能,特别是处理大量并发任务时。