Java8~21新特性合集(详解)

发布于:2024-04-30 ⋅ 阅读:(26) ⋅ 点赞:(0)

java8

  1. Lambda 表达式:Lambda表达式允许在代码中直接定义匿名函数,这简化了对函数式编程的支持,使代码更简洁、更灵活。它允许在方法中传递代码块,从而实现更加灵活的编程方式。
  2. Stream API:Stream API提供了一套声明式的方式处理数据集合的框架,可以简化数据处理的复杂性。例如,filter方法用于过滤出所有符合条件的元素,map方法用于将元素转换为另一种类型,sorted方法用于排序等。
  3. 接口默认方法:Java 8允许在接口中定义默认方法,这些方法在实现类中可以被继承和覆盖,从而提供了更多的灵活性。
  4. 新的日期和时间API:Java 8引入了一个新的日期和时间API,这个API提供了更多的功能,包括处理时区、时间间隔、日期时间格式化等。
  5. 方法引用:方法引用是Lambda表达式的一个简化写法,可以直接引用已存在的方法或构造器。
  6. Optional 类:Optional是一个容器对象,用于解决可能出现的空指针异常问题。它提供了一种更好的方式来处理可能为null的值。
  7. 并行流:Java 8引入了并行流,它可以在多个线程上并行地处理集合数据,从而提高程序的性能。
  8. 函数式接口:函数式接口是只有一个抽象方法的接口,可以用作Lambda表达式的目标类型。

java9

  1. 模块化系统:Java 9引入了平台级模块系统,使得JDK可以更模块化,能够在更小的设备中使用。通过模块化,应用程序只需要加载所需的那部分JDK模块,而不是整个JDK框架。这种模块化不仅优化了JDK的大小,还提高了代码的可维护性和封装性。
  2. JShell:Java 9引入了JShell,这是一个交互式编程环境,允许用户即时运行Java代码片段,并进行探索和实验。JShell支持自动补全和从文件中加载或保存语句,为学习和开发Java提供了便利。
  3. 接口中的私有方法:在Java 9中,接口可以定义私有方法。这些私有方法可以作为通用方法放在默认方法中调用,虽然在实际应用中可能并不常用,但它为接口的设计提供了更多的灵活性。
  4. 集合加强:Java 9为所有集合(List/Set/Map)增加了of和copyOf方法,用于创建不可变集合。一旦创建,这些集合就无法再执行添加、删除、替换、排序等操作,否则将抛出异常。
  5. 多版本兼容的jar包:Java 9改进了对多版本jar包的支持,使得同一个jar包可以包含针对不同Java版本的类文件。
  6. 语法改进:Java 9在语法上进行了一些改进,如try语句的升级和String存储结构的变更,这些改进提高了代码的简洁性和可读性。
  7. 增强的Stream API:Java 9对Stream API进行了增强,提供了更多的操作和更好的性能。

java10

  1. 局部变量类型推断:Java 10引入了局部变量类型推断的功能,允许程序员使用var关键字代替具体的类型声明。编译器会根据初始化表达式的类型自动推断变量的类型。这一特性简化了代码书写,提高了可读性,尤其是在处理复杂类型如泛型和匿名内部类时。但需要注意的是,过度使用var可能会导致代码可读性降低,因此应谨慎使用。
  2. 接口默认方法和静态方法:Java 10允许在接口中定义默认方法和静态方法。这使得接口能够拥有一些实现细节,而不仅仅是声明方法。
  3. 异常处理改进:Java 10引入了新的异常处理机制,包括新的异常类型java.lang.invoke.MethodHandleExceptionjava.lang.invoke.MethodHandles.LookupException。这些新的异常类型使得异常处理更加清晰和准确。
  4. Unicode 10支持:Java 10支持Unicode 10,引入了更多的字符集和表情符号。这使得Java在处理国际化文本和表情符号时更加全面和准确。
  5. HTTP/2支持:Java 10支持HTTP/2协议,使得在处理网络请求时更加高效和快速。

java11

  1. 局部变量类型推断:Java 11正式引入了局部变量类型推断,允许开发者使用var关键字来声明局部变量而无需显式指定类型。这一特性可以简化代码,减少冗余,提高代码的可读性。例如,在声明一个ArrayList时,可以使用var list = new ArrayList<String>();而无需显式指定ArrayList<String>类型。
  2. HTTP/2的原生支持:Java 11增加了对HTTP/2的原生支持,使得开发者可以使用标准的Java API来创建HTTP/2的客户端和服务器。HTTP/2通过复用连接、头部压缩和并行请求等技术提升了网络性能,而Java 11的原生支持使得使用HTTP/2更加便捷。
  3. 字符串API增强:Java 11对字符串API进行了增强,引入了一些新的方法和功能来处理字符串。例如,isBlank()方法用于检测字符串是否为空白,lines()方法用于将字符串拆分成行,以及strip()stripLeading()stripTrailing()等方法用于去除字符串前后的空格。
  4. Epsilon垃圾收集器:Java 11引入了一种新的垃圾收集器,名为Epsilon。这是一种无操作(No-Op)的垃圾回收器,用于在测试和性能调优场景下进行使用。
  5. ZGC垃圾收集器:Java 11还引入了一种全新的垃圾收集器,名为ZGC。ZGC的设计目标是实现低延迟和高吞吐量,这对于需要快速响应和低停顿时间的应用非常有用。
  6. 嵌套访问控制:Java 11引入了嵌套的访问控制,允许在一个类中访问另一个类的私有成员。这增强了类的封装性,并提供了更灵活的方式来组织和访问类成员。

 java12 

  1. 改进的Switch语句:Java 12对Switch语句进行了扩展,使其可以作为表达式(expression)使用,而不仅仅是语句(statement)。这种新的Switch表达式支持传统的switch语法,也可以使用简化的“case L ->”模式匹配语法。这使得代码更加简洁,并减少了编写额外的样板代码的需要。例如,现在可以根据一个值直接返回一个字符串,而无需使用复杂的if-else或switch-case结构。
  2. Shenandoah垃圾收集器:Java 12引入了Shenandoah垃圾收集器,这是一个与G1收集器类似的低延迟垃圾收集器。Shenandoah的特点包括可以控制在10毫秒以内的最低暂停时间,全堆操作(无需在单独的年轻代和老年代之间划分内存),以及在默认情况下未启用,需要通过JVM参数启用。这使得Java应用在处理大量数据时能保持更稳定的性能。
  3. 微基准测试套件:JDK源码中新增了一套微基准测试套件,使得开发人员可以轻松运行现有的微基准测试并创建新的基准测试。这有助于开发人员更准确地评估代码的性能并进行优化。
  4. JShell工具:Java 12中,JShell成为了一个标准的JDK工具。JShell是一个交互式解释器,允许开发人员在不使用编译器的情况下实验和测试Java代码片段。这对于新手学习和调试代码非常有用。

java13 

  1. 动态CDS档案(Dynamic CDS Archives):这一特性扩展了AppCDS(应用程序类数据共享)的功能,允许Java应用程序在执行结束时动态归档类。归档的类包括默认的基础层CDS存档中不存在的所有已加载的应用程序类和库类。这一改进提高了类数据使用的简易性,并减少了在使用类数据存档时创建类加载列表的必要性,从而简化了使用类数据共享的步骤。
  2. ZGC垃圾收集器的改进:Java 13增强了ZGC(Z Garbage Collector)的功能,使其能够更有效地将未使用的堆内存返回给操作系统。这有助于优化内存管理,提高应用程序的性能。
  3. 重新实现旧版套接字API:Java 13使用更简单、更现代的实现替换了java.net.Socket和java.net.ServerSocket API的底层实现,使其更易于维护和调试。
  4. Switch表达式的预览:在Java 12中引入的Switch表达式预览特性在Java 13中得到了进一步的改进和扩展。这使得Switch语句更加灵活和强大,支持更复杂的条件匹配和表达式返回。
  5. 文本块(Text Blocks):Java 13将文本块添加到了Java语言中,使得多行字符串的编写更加简洁和易读。

java14 

  1. instanceof模式匹配:Java 14对instanceof操作符进行了改进,加入了模式匹配的功能。这意味着现在可以在instanceof表达式中直接声明变量类型,并在判断类型的同时进行变量赋值,从而实现了更紧凑和易读的代码。
  2. 新Switch表达式:Java 14扩展了Switch语句的功能,使其支持表达式形式的判断,使得代码更加简洁和易读。这一改进允许开发者在Switch语句中直接返回结果,减少了样板代码的使用。
  3. 文本块(Text Blocks):Java 14引入了文本块这一新特性,它允许开发者更方便地编写和维护格式化的多行字符串。这有助于简化字符串的创建和格式化过程,提高代码的可读性和可维护性。
  4. 记录类型(Records):Java 14引入了一种新的类类型——记录类型(Records),它用于创建不可变的、简单的数据类。记录类型自动为类的所有字段生成getter方法,并且重写了equals()、hashCode()和toString()方法,使得开发者可以更方便地创建和使用简单的数据类。
  5. 弃用和移除的功能:Java 14弃用了一些不再推荐使用的功能,如Solaris和SPARC端口,以及CMS垃圾收集器。同时,还移除了一些不再使用的API和工具,如Pack200工具和API。这些改变有助于简化Java平台,提高整体性能和稳定性。

java15

  1. 文本块(Text Blocks):Java 15中引入了文本块这一新特性,它允许在代码中编写多行字符串,无需使用连接符或转义字符。这使得编写格式化字符串或嵌入多行文本(如SQL查询、JSON、XML等)变得更加简洁和易读。
  2. 模式匹配(Pattern Matching):Java 15增强了instanceof操作符的模式匹配功能,允许在判断对象类型的同时进行变量赋值。这一改进简化了类型转换和条件判断的代码,提高了代码的可读性和可维护性。
  3. 密封类(Sealed Classes):密封类是一个预览特性,它提供了一种方式来严格控制类或接口的继承。密封类可以限制哪些其他类或接口可以继承或实现它们,从而增强了代码的安全性和封装性。
  4. 默认垃圾收集器(Default Garbage Collector):Java 15引入了新的默认垃圾收集器ZGC(Z Garbage Collector),这是一种可扩展、高吞吐量的垃圾收集器。它旨在提供低延迟的垃圾回收性能,适用于对性能要求较高的应用场景。
  5. EdDSA数字签名算法:Java 15支持使用Edwards-Curve Digital Signature Algorithm (EdDSA)实现加密签名。与其他签名方案相比,EdDSA具有更高的安全性和性能,并已在其他加密库中得到广泛应用。

java16

  1. 模式匹配instanceof(正式版):这个特性允许在一行代码中同时完成类型检查和类型转换,使代码更加简洁、易读和安全。例如,if (obj instanceof String str && str.length() > 0) {...}
  2. Records(记录):在Java 14中引入并在Java 16中进行了优化和改进。Records提供了一种紧凑的语法来声明类,这些类是浅层不可变数据的透明持有者,可以简化类的声明并提高代码的可读性和可维护性。
  3. 外部内存访问API:Java 16引入了一套API,允许Java程序安全和高效地访问外部内存。这是替代sun.misc.Unsafe的一种方式,提供了更安全的内存访问机制。
  4. JVM改进:包括ZGC并发线程处理等的改进,提高了应用程序的性能和效率。
  5. 其他API和语言改进:Java 16还包含了许多其他的API更新和语言改进,以增强开发者的编程效率和代码质量。

java17

  1. Switch表达式的增强:Java 17在Switch表达式方面进行了增强,支持Lambda表达式和块语句。这使得Switch语句更加灵活和强大,能够处理更复杂的条件匹配和表达式返回。
  2. 新的类型推断机制:Java 17改进了类型推断机制,允许在Lambda表达式和匿名内部类中使用var关键字。这有助于简化代码并减少样板代码的使用。
  3. 文本块(Text Blocks):Java 17引入了文本块语法,用于更方便地处理多行字符串,无需使用连接符或转义字符。这使得定义JSON数据或编写其他格式化文本时更加简洁和易读。
  4. 密封类(Sealed Classes):Java 17正式转正了密封类,这是一种更加严格和灵活的类继承机制。通过限制哪些类可以继承一个给定的类,密封类增强了代码的安全性和封装性。
  5. 类型模式匹配:Java 17引入了类型模式匹配,这是一种更加灵活和简洁的模式匹配方式。它使得代码更加易读和易维护,特别适用于需要进行类型判断和变量赋值的情况。
  6. 增强的垃圾回收器:Java 17引入了一种新的ZGC(Z Garbage Collector)垃圾回收器,它具有更快的响应时间和更低的暂停时间,可以更好地支持大型内存和低延迟应用程序。
  7. 增强的数据类型:Java 17引入了一些新的数据类型,如预期类型和简单类型,这些类型可以提高编程效率并减少代码量。
  8. 改进的安全性:Java 17引入了一些新的安全功能,如默认封装JDK内部类和弃用安全管理器等,以更好地保护应用程序免受潜在的攻击和漏洞。

java18

  1. 默认UTF-8字符编码:Java 18将UTF-8设置为默认字符集,这有助于简化字符编码的处理,特别是在处理国际化文本时。
  2. 简单的Web服务器:Java 18引入了一个简易的Web服务器,使得开发者能够更方便地构建和测试Web应用。
  3. Javadoc中的代码片段:Java 18在Javadoc中支持代码片段,提供了高亮代码片段、正则高亮代码片段、替换代码片段等功能,从而增强了API文档的可读性和实用性。
  4. 使用方法句柄重新实现反射核心功能:这一新特性提供了更高效、更灵活的反射机制,有助于提升性能并简化代码。
  5. Vector API(第三次孵化):Java 18进一步孵化了Vector API,这个API提供了更多关于向量的操作,使得处理向量数据更加便捷。
  6. 互联网地址解析SPI:Java 18引入了互联网地址解析SPI,这个新特性提供了更灵活、更可扩展的互联网地址解析机制。
  7. Foreign Function & Memory API(第二次孵化):这个API允许Java程序调用外部函数和访问外部内存,增强了Java与外部代码的互操作性。
  8. switch表达式(二次孵化):Java 18进一步改进了switch表达式,提供了更强大、更灵活的模式匹配功能

java19

  1. 记录模式(Record Patterns):Java 19预览了记录模式的功能,这允许程序员在解构记录值时使用模式匹配。记录模式和类型模式可以嵌套,以支持声明式的、功能强大的、可组合的数据导航和处理形式。
  2. JDK移植到Linux/RISC-V:Java 19支持将JDK移植到Linux/RISC-V平台,目前主要支持RISC-V的RV64GV配置(包含向量指令的通用64位ISA)。未来可能会考虑支持其他RISC-V配置。
  3. 外部函数和内存API:Java 19预览了外部函数和内存API(Foreign Function & Memory API)。这个API允许Java程序通过调用外部函数(JVM之外的代码)和安全地访问外部内存(不受JVM管理的内存)来与Java运行时之外的代码和数据进行互操作。
  4. 虚拟线程(Virtual Threads):Java 19预览了虚拟线程的功能。虚拟线程与操作系统线程的关系不再是一一对应,而是由JVM进行管理。这种线程模型可以提高应用程序的并发性能和吞吐量。
  5. 结构化并发(Structured Concurrency):Java 19引入了结构化并发的概念,旨在通过结构化并发API简化多线程编程。这种并发性将不同线程中运行的多个任务视为单个工作单元,以简化错误处理和取消,提高了可靠性和可观察性。

java20

  1. 结构化并发:Java 20引入了结构化并发的新API,这有助于简化多线程编程。通过将不同线程执行的多任务视为一个内聚工作单元,它消除了复杂的错误处理和过程,提高了应用程序的可靠性和可观察性。
  2. 虚拟线程:作为结构化并发的基础,Java 20中的虚拟线程成为轻量级的线程,为高吞吐量并发应用程序提供了支持。虚拟线程与操作系统线程的关系不再是一一对应,而是由JVM进行管理,这有助于提升应用程序的并发性能和吞吐量。
  3. Vector API:在Java 20中,矢量API提案进行了重新提交,但未进行任何更改。该提案旨在使在运行时高效编译的矢量计算表达在支持的CPU架构上运行,从而显著提高性能。虽然API本身没有变化,但Java 20对Vector API进行了第四次孵化更新,修复了一些错误Bug并提高了性能。
  4. 作用域值(孵化器):作用域值允许在线程内和线程间共享不可变数据,并且优先于线程局部变量。这使得代码更加灵活和有效地处理多继承问题,提高了代码的可读性和可维护性。
  5. 内存API:Java 20中的内存API为Java程序提供了内存管理功能,允许用户通过内存管理优化性能和节省资源。这为开发者提供了更灵活和高效的方式来管理内存。
  6. 外部函数与内存API:Java 20支持直接访问外部函数和内存,这增强了代码的效率和灵活性。它允许开发者通过调用外部函数和访问外部内存来与Java运行时之外的代码和数据进行互操作,提高了应用程序的扩展性和可定制性。
  7. 日期和时间API:Java 20引入了新的日期和时间API,以更好地处理日期和时间相关的操作。这个新的API提供了更强大和灵活的日期和时间处理能力,以及更好的可读性和可维护性。

java21

  1. 模式匹配 instanceof 操作符:Java 21引入了新的模式匹配 instanceof 操作符,这使得开发者可以通过模式匹配来简化类型转换的代码,提高了代码的可读性和可维护性。
  2. 本地模式变量:Java 21允许在方法体内使用本地变量的模式,这样的设计让代码更加简洁易读。
  3. switch 表达式的增强:Java 21对 switch 表达式进行了进一步的增强,它支持使用箭头语法和多个表达式作为一个分支的结果,从而提供了更强大和灵活的分支处理能力。
  4. raw 字符串:Java 21引入了 raw 字符串,它可以在字符串中保留原始格式,无需再使用转义字符,使得字符串处理更加直观和方便。
  5. 数字操作器的改进:Java 21对于数字操作器进行了改进,包括提供了新的数值范围检查操作、新的数值运算方法等,提升了数字处理的效率和准确性。
  6. 增强的异步编程:Java 21在异步编程方面进行了改进,提供了更加强大和简化的异步编程功能,包括 CompletableFuture 的新方法和改进的异步流,使得异步编程更加简洁和高效。
  7. 字符串模板:Java 21引入了字符串模板,为字符串拼接提供了更灵活、更直观的方式,使得字符串操作更为便捷。
  8. 顺序集合:Java 21引入了新的接口来表示具有定义相遇顺序的集合,每个这样的集合都有定义明确的元素顺序,并提供了统一的应用程序接口,用于访问和处理其元素。
  9. 记录模式和类型模式:Java 21中的记录模式和类型模式可以嵌套,以实现更强大、声明性和可组合的数据导航和处理形式。