以下是从Java 8(JDK 8)到Java 17(JDK 17)各个版本之间的主要区别和新增特性:
Java 8(JDK 8)
Lambda表达式:Lambda表达式允许将函数作为方法参数传递,使得代码更加简洁、易读。它还可以用于实现函数式接口的实例。
函数式接口:只包含一个抽象方法的接口。Java 8引入了@FunctionalInterface
注解,以显式指定一个接口是函数式接口。
Stream API:一种新的数据处理工具,可以对集合进行函数式编程操作,例如过滤、映射、归约等。Stream API支持并行处理,有助于提高性能。
Optional类:一种包装器类,用于表示一个值可能存在也可能不存在。它有助于避免空指针异常,提高代码的健壮性。
接口的默认方法和静态方法:Java 8允许在接口中定义带有实现的默认方法和静态方法,有助于在不破坏现有实现的情况下向接口添加新方法。
新的日期和时间API:Java 8引入了全新的日期和时间API,提供了不可变的日期和时间类,如LocalDate
、LocalTime
、LocalDateTime
等,以及用于解析、格式化日期和时间的类,如DateTimeFormatter
。
Nashorn JavaScript引擎:一种新的JavaScript引擎,允许在Java应用程序中嵌入和执行JavaScript代码。
并行数组操作:Java 8引入了Arrays.parallelSort()
等方法,以支持对数组进行并行操作,从而提高性能。
新的收集器:Java 8引入了许多新的收集器,如Collectors.toList()
、Collectors.toSet()
等,以便将Stream API操作的结果收集到集合中。
CompletableFuture:Java 8中的CompletableFuture
是Future
的增强版本,它提供了更丰富的API,支持异步编程、管道化操作和组合多个异步任务。
Java 9(JDK 9)
JEP 261: 模块系统(Java Platform Module System,JPMS):这是 Java 9 中最显著的变化,它将 JDK 划分为一组模块,以提高封装性、安全性和可维护性。模块系统还允许开发者在自己的应用程序中使用模块,提高代码的可组织性和可维护性。
JEP 223: 新的版本号方案:Java 9 引入了一个新的版本号方案,使版本号更加简洁且易于理解。
JEP 222: jshell(Java Shell):Java 9 引入了一个交互式 REPL(Read-Eval-Print Loop)工具,名为 jshell,它允许开发者在不编写完整的 Java 类的情况下快速尝试 Java 代码片段。
JEP 254: Compact Strings:这个特性优化了 Java 中字符串的内存表示,将大多数字符串的内存占用减少了一半,从而提高了性能。
JEP 238: 多发行版 JAR 文件:这个特性允许将针对不同 Java 版本的类文件打包到同一个 JAR 文件中,简化了跨版本的 Java 应用程序部署。
JEP 282: jlink 工具:这个特性引入了一个新的工具 jlink,它允许开发者创建自定义的 Java 运行时映像,仅包含应用程序所需的模块,从而减小应用程序的体积。
JEP 266: 增强的 Java 并发 API:Java 9 对 java.util.concurrent 包进行了扩展和改进,引入了 CompletableFuture API 的改进以及新的 Reactive Streams API。
JEP 193: 变量句柄(Variable Handles):这个特性提供了一种更灵活、更高效的方式来访问对象的字段,类似于 java.util.concurrent.atomic 中的 Atomic 类,但更通用。
JEP 259: Stack-Walking API:这个特性引入了一个新的 API,用于在 Java 中遍历和过滤堆栈跟踪,提高了堆栈处理的性能。
JEP 102: 进程 API 更新:这个特性对 Java 的进程 API(java.lang.Process)进行了改进,提供了更好的操作系统进程控制和管理。
Java 10(JDK 10)
JEP 286: 局部变量类型推断(Local-Variable Type Inference):这个特性引入了关键字 var
,允许开发者在声明局部变量时省略变量类型,让编译器自动推断类型。这使得代码更简洁,提高了可读性。
JEP 296: 废弃并移除工具和 API:此特性废弃了一些不再使用的工具和 API,为未来的 Java 版本提供了更加干净的基础。
JEP 204: 基于垃圾回收的并发线程堆栈处理:这个特性为 G1 垃圾收集器引入了并发线程堆栈处理功能,提高了垃圾回收的性能。
JEP 307: 并行全 GC:这个特性使 G1 垃圾收集器的全 GC(Full GC)过程并行化,从而提高了 G1 的性能和可预测性。
JEP 312: 应用类数据共享(Application Class-Data Sharing):这个特性允许将应用程序类的元数据存储在共享归档中,从而提高了应用程序的启动速度和响应性。
JEP 319: 根证书:将一组根证书添加到 OpenJDK,以便 OpenJDK 可以和 Oracle JDK 在安全性方面保持一致。
JEP 322: 新的版本号方案:此特性为 Java 版本号提供了更简单、更清晰的表示。
Java 11(JDK 11)
JEP 181: Epsilon:一个无操作(No-Op)垃圾收集器。这个特性主要用于测试和性能分析,它不会回收任何内存,从而帮助开发者识别和分析垃圾回收对应用性能的影响。
JEP 309: 动态类文件常量(Dynamic Class-File Constants):引入了一种新的常量池表达式,可以在运行时动态解析。这个特性允许更紧凑、更高效的表示,提高了性能和可扩展性。
JEP 315: 改进 AArch64 架构的支持:此特性旨在为 AArch64(ARM64)架构提供更好的支持,提高 Java 在这个平台上的性能。
JEP 318: 基于 Epsilon 的低延迟垃圾收集器(ZGC):这是一种新型的垃圾收集器,旨在实现可扩展性、低延迟和高吞吐量。ZGC 通过并发的、多阶段的回收策略来降低停顿时间。
JEP 320: 移除 Java EE 和 CORBA 模块:这个特性从 JDK 中移除了 Java EE 和 CORBA 相关的模块,以减小 JDK 的体积,降低维护成本。这些模块在 Java 9 中就已被标记为废弃。
JEP 321: HTTP 客户端(标准):此特性将 Java 9 和 Java 10 中的 HTTP 客户端 API 作为标准功能引入,支持 HTTP/1.1 和 HTTP/2,以及 WebSocket。新的 API 也支持同步和异步编程模式。
JEP 323: 局部变量语法的改进:这个特性改进了使用 var
声明局部变量的语法,使得 var
可以用于 Lambda 参数。
JEP 324: Key Agreement with Curve25519 and Curve448:为 Java 密码学框架引入了两种新的椭圆曲线,提高了加密安全性。
JEP 327: Unicode 10:更新了 Java 平台的 Unicode 支持,以包含 Unicode 10 标准中的新字符集和属性。
JEP 328: Flight Recorder:这是一个低开销的数据收集框架,可以用于生产环境中的问题诊断和性能分析。
JEP 331: 低开销分析事件(JVM Low-Overhead Heap Profiling):这个特性提供了一种低开销的方法来收集堆内存分配的分析数据。它引入了一种新的抽样分析机制,允许在生产环境中监控和分析内存使用情况。
JEP 332: Transport Layer Security (TLS) 1.3:这个特性为 Java 添加了对 TLS 1.3 协议的支持,提高了 Java 在网络安全方面的能力。
Java 12(JDK 12)
JEP 189: Shenandoah:一个低暂停时间的垃圾收集器。Shenandoah 是一种并发垃圾收集器,它的目标是降低 GC 停顿时间,适用于具有大堆内存的应用程序。
JEP 230: 微基准测试套件(Microbenchmark Suite):这个特性引入了一组基准测试,用于衡量 JDK 组件的性能。这有助于开发者评估新特性、优化和回归的性能影响。
JEP 325: Switch 表达式(预览):这个特性引入了一种新的 switch 表达式语法,使得 switch 语句更简洁、更安全。此特性在 Java 12 中作为预览功能引入,最终在 Java 14 中成为正式特性。
JEP 334: JVM 常量 API:这个特性引入了一组 API,用于对 JVM 类文件中的常量进行模型化。这有助于开发者更轻松地操作和分析 Java 类文件。
JEP 340: ZGC(Z Garbage Collector)的一致性和可用性改进:此特性改进了 ZGC 的性能和可用性,使其在 Windows 和 macOS 上可用。
JEP 341: 默认的 CDS(Class Data Sharing)归档:此特性引入了默认的类数据共享归档,用于加速 JVM 的启动速度。
JEP 344: Abortable Mixed Collections for G1:此特性改进了 G1 垃圾收集器的性能,使其在发生长时间暂停时可以中止混合收集。
Java 13(JDK 13)
JEP 350: 动态 CDS 归档:此特性允许将应用程序类的元数据存储在共享归档中,以便在应用程序的多个 JVM 实例之间共享。这有助于提高应用程序的启动速度和减少内存占用。
JEP 351: ZGC 的并发类卸载:此特性为 Z 垃圾收集器(ZGC)添加了并发类卸载的支持,从而进一步降低 GC 停顿时间。
JEP 353: 重新实现遗留的 Socket API:此特性引入了一个新的、现代化的 Socket API,用于替代遗留的、基于阻塞 I/O 的 API。新的 API 提供了更好的性能和可扩展性。
JEP 354: Switch 表达式(第二次预览):这个特性继续完善了 Java 12 中引入的 switch 表达式,并在 Java 13 中作为预览功能提供。这个改进使 switch 语句更简洁、更安全。最终在 Java 14 中成为正式特性。
JEP 355: 文本块(预览):这个特性引入了文本块(也称为多行字符串字面量),使得编写多行字符串更加简单和易读。文本块在 Java 13 中作为预览功能引入,最终在 Java 15 中成为正式特性。
Java 14(JDK 14)
JEP 305: instanceof 的模式匹配(预览):这个特性引入了模式匹配的概念,它可以简化 instanceof 操作的使用,使代码更简洁、更易读。在 Java 14 中作为预览功能引入。
JEP 343: Packaging Tool(Incubator):此特性引入了一个新的打包工具(jpackage),用于将 Java 应用程序打包为平台特定的可执行文件。这有助于改进应用程序的部署和分发。
JEP 345: NUMA-Aware Memory Allocation for G1:此特性为 G1 垃圾收集器添加了对非统一内存访问(NUMA)的支持,以提高性能。
JEP 349: JFR Event Streaming:这个特性引入了 Java Flight Recorder(JFR)事件流,允许开发者实时处理 JFR 事件,而无需等待事件文件的生成。
JEP 352: 非易失性映射的文件通道 API:这个特性为 java.nio.channels.FileChannel 类添加了新的 API,以支持非易失性内存(Non-Volatile Memory,NVM)映射。
JEP 358: 有用的 NullPointerException:此特性改进了 NullPointerException 的描述性信息,帮助开发者更轻松地诊断和修复问题。
JEP 359: Records(预览):这个特性引入了一种新的数据类,称为记录(Record),可以简化数据类的编写。在 Java 14 中作为预览功能引入,最终在 Java 16 中成为正式特性。
JEP 361: Switch 表达式(正式):这个特性将 Java 12 和 13 中引入的 switch 表达式作为正式功能引入。新的 switch 语法使得 switch 语句更简洁、更安全。
Java 15(JDK 15)
JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA): 此特性引入了对 Edwards-Curve 数字签名算法 (EdDSA) 的支持,这是一种现代的加密算法,提供了更高的安全性和性能。
JEP 360: Sealed Classes (预览): 该特性引入了封装类和接口,使得类的继承结构可以限制在某些明确指定的类中。这有助于提高模型的安全性和可维护性。
JEP 371: Hidden Classes: 这个特性引入了一种新的类种类——隐藏类,这些类不能被直接引用,主要用于框架和运行时生成类。
JEP 372: Remove the Nashorn JavaScript Engine: 这个特性移除了 Nashorn JavaScript 引擎。Nashorn 在早期版本中已被标记为废弃,现在正式被移除。
JEP 374: Disable and Deprecate Biased Locking: 该特性禁用了偏向锁,并计划在未来的版本中移除。偏向锁是一种优化手段,但对于现代应用程序的影响变得不明显。
JEP 375: Pattern Matching for instanceof (第二次预览): 这个特性继续完善了 Java 14 中引入的 instanceof 的模式匹配,并在 Java 15 中作为预览功能提供。这个改进使 instanceof 操作更简洁、更安全。
JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (正式): 此特性将 Z 垃圾收集器(ZGC)作为正式功能引入。ZGC 是一种低延迟、可伸缩的垃圾收集器,适用于具有大堆内存的应用程序。
JEP 378: Text Blocks (正式): 这个特性将 Java 13 中引入的文本块(也称为多行字符串字面量)作为正式功能引入。文本块使编写多行字符串更加简单和易读。
JEP 379: Shenandoah: A Low-Pause-Time Garbage Collector (正式): 此特性将 Shenandoah 垃圾收集器作为正式功能引入。Shenandoah 是一种低暂停时间的垃圾收集器,适用于具有大堆内存的应用程序。
JEP 381: Remove the Solaris and SPARC Ports: 该特性移除了对 Solaris 和 SPARC 平台的支持,这是因为这些平台的使用率已经降低。
Java 16(JDK 16)
JEP 338: Vector API (Incubator):此特性引入了一个新的矢量 API,用于在 Java 中表达和操作矢量计算。这有助于实现更高性能的数学和图形操作。
JEP 347: Enable C++14 Language Features:此特性更新了 JDK 源代码,以允许使用 C++14 语言特性。这有助于提高 JDK 的代码质量和可维护性。
JEP 357: Migrate from Mercurial to Git:此特性将 JDK 的版本控制系统从 Mercurial 迁移到 Git,以提高工作效率和降低存储成本。
JEP 369: Migrate to GitHub:此特性将 JDK 的开发从自托管的 Git 仓库迁移到 GitHub,以提高开发效率和协作。
JEP 376: ZGC: Concurrent Thread-Stack Processing:此特性为 Z 垃圾收集器(ZGC)引入了并发线程栈处理,从而进一步降低垃圾收集的暂停时间。
JEP 380: Unix-Domain Socket Channels:这个特性引入了对 Unix 域套接字通道的支持,允许在同一主机上的进程之间进行高效的通信。
JEP 386: Alpine Linux Port:此特性引入了对 Alpine Linux 和 musl C 库的支持,从而使 Java 可以在轻量级的容器环境中运行。
JEP 387: Elastic Metaspace:此特性改进了类元数据的内存管理,使其更加灵活和高效,从而降低内存占用和提高性能。
JEP 389: Foreign Function & Memory API (Incubator):此特性引入了一种新的 API,用于在 Java 中访问本地代码和内存。这有助于简化本地资源的访问和操作。
JEP 390: Warnings for Value-Based Classes:此特性引入了针对值类型的警告,以提醒开发者注意与值类型相关的潜在问题。
JEP 392: Packaging Tool:这个特性正式引入了 jpackage 打包工具,用于将 Java 应用程序打包为平台特定的可执行文件。
JEP 393: Foreign Function & Memory API (第二次孵化):此特性继续完善和扩展第一次孵化的 Foreign Function & Memory API。
JEP 394: Pattern Matching for instanceof:这个特性正式引入了模式匹配的概念,它可以简化 instanceof 操作的使用,使代码更简洁、更易读。
JEP 395: Records:此特性正式引入了记录(Record)类,这是一种简化数据类定义的方法。记录类可以减少样板代码并提高代码的可读性和不变性。
JEP 396: Strongly Encapsulate JDK Internals by Default:此特性默认强化了 JDK 内部 API 的封装,以提高安全性和可维护性。开发者可以通过命令行选项来放宽封装限制,但这不是推荐的做法。
JEP 397: Sealed Classes (第二次预览):此特性继续完善 JDK 15 中引入的封装类(Sealed Class)概念,并在 Java 16 中作为预览功能提供。封装类和接口可以限制继承结构,提高模型的安全性和可维护性。
Java 17(JDK 17)
Java 17(JDK 17)是一个长期支持(LTS)版本,相对于前一个LTS版本(Java 11)以及Java 16,它引入了以下新特性:
JEP 356: Enhanced Pseudo-Random Number Generators:这个JEP为伪随机数生成器(PRNGs)提供了一个新的更强大的API,允许用户更方便地选择和配置不同的PRNG算法。
JEP 382: New macOS Rendering Pipeline:引入了一个新的渲染管线,用于在macOS平台上替换现有的Quartz管线,改进图形性能。
JEP 389: Foreign Function & Memory API (Incubator):这个功能为调用本地代码(如C和C++)提供了一个新的API,使得在Java代码中更容易地访问本地库和本地内存。
JEP 411: Deprecate the Security Manager for Removal:这个JEP计划逐步移除Java中的Security Manager和相关API,因为它们已经不再适应现代应用程序的安全需求。
JEP 391: macOS/AArch64 Port:这个JEP为基于Apple M1芯片的macOS/AArch64平台提供了Java的支持。
JEP 398: Deprecate the Applet API for Removal:这个JEP计划移除Java中已过时的Applet API,因为现代Web浏览器已经不再支持Java Applets。
JEP 347: Enable C++14 Language Features:这个JEP允许在JDK源代码中使用C++14语言特性,以便更好地支持跨平台的开发。
JEP 376: ZGC: Concurrent Thread-Stack Processing:这个JEP为Z垃圾收集器带来了并发线程栈处理功能,提高了垃圾回收的性能。
JEP 390: Warnings for Value-Based Classes:这个JEP为值类型类添加了警告,以提醒开发者在使用这些类时注意同步和标识敏感的操作。
JEP 394: Pattern Matching for switch(正式版):这个JEP将Java 12和13中预览的Pattern Matching for switch功能引入为正式功能,增强了switch语句的功能,使其更加简洁和可读。
JEP 395: Records(正式版):这个JEP将Java 14和15中预览的Records功能引入为正式功能,简化了数据类的创建过程。
JEP 396: Sealed Classes(正式版):这个JEP将Java 15和16中预览的Sealed Classes功能引入为正式功能,限制类的可扩展性,提高了封装性
JEP 386: Alpine Linux Port 为 Alpine Linux 及其基于 musl 的 C 库提供了 Java 支持。Alpine Linux 是一个轻量级、安全的 Linux 发行版,广泛应用于容器环境。JEP 386 让 Java 开发者更容易在 Alpine Linux 上部署和运行 Java 应用程序,节省资源并提高安全性。
JEP 376: ZGC: Concurrent Thread-Stack Processing:这个JEP为Z垃圾收集器带来了并发线程栈处理功能,提高了垃圾回收的性能。
JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production):这个JEP将ZGC提升为正式功能,ZGC是一款可扩展的低延迟垃圾回收器,目标是在保持低延迟的同时提高应用的吞吐量。
JEP 387: Elastic Metaspace:这个JEP旨在减少Java元空间的内存使用,提高内存分配和回收的响应速度。
JEP 389: Foreign Function & Memory API (Incubator):这个JEP引入了一个新的API,用于在Java中调用本地代码(如C和C++),使得跨平台本地代码调用变得更加简单。
JEP 390: Warnings for Value-Based Classes:为值类型类添加警告,以提醒开发者在使用这些类时注意同步和标识敏感的操作。
JEP 392: Packaging Tool:这个JEP引入了一个新的命令行工具jpackage
,用于将Java应用程序打包为平台特定的格式,如Windows的msi、macOS的dmg或Linux的rpm和deb文件。
JEP 394: Pattern Matching for switch (Preview):这个JEP为switch
语句引入了模式匹配功能,使其更加简洁和可读。
JEP 396: Strongly Encapsulate JDK Internals by Default:这个JEP默认强烈封装JDK内部API,以提高安全性和可维护性。