JDK各版本新特性(更新到Java22)

Hello,I'm Shendi

每当Java出新版本我会第一时间更新

目录

各版本JDK下载

JDK 1.0

1996-01-23 Oak(橡树)

JDK 1.1

1997-02-19

JDK 1.2

1998-12-08 Playground(操场)

JDK 1.3

2000-05-08 Kestrel(红隼)

JDK 1.4

2004-02-06 Merlin(隼)

JDK 1.5新特性

2004-9-30(Tiger)老虎

JDK 1.6

2006-12-11 Mustang(野马)

JDK 7新特性:

2011-07-28 Dolphin(海豚)

JDK 1.8

2014-03-18

JDK 9新特性:

    2017-9-22

Java 10

2018-3-21

Java 11

2018-09-25

Java12

2019-3-19

Java13

2019-9-17

Java14

2020-3-17

Java15

2020-9-15

Java16

2021-3-16

Java17(LTS)

2021-9-14

Java18

2022-03-22

Java19

2022-09-20

Java20

2023-03-21

Java21(LTS)

2023-09-19

Java22

2024-03-19


各版本JDK下载

可以前往官网下载

Java Downloads | Oracle

或在文章最下方关注公众号在公众号内发送 100000 下载

JDK 1.0

1996-01-23 Oak(橡树)

    初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,

    性能比较差,运行速度慢

JDK 1.1

1997-02-19

    JDBC(Java DataBase Connectivity)

    支持内部类

    RMI(Remote Method Invocation)

    反射

    Java Bean

JDK 1.2

1998-12-08 Playground(操场)

    集合框架

    JIT(Just In Time)编译器

    对打包的Java文件进行数字签名

    JFC(Java Foundation Classes)包括Swing1.0,拖放和Java2D类库

    Java插件

    JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型

    Applet中添加声音支持

JDK 1.3

2000-05-08 Kestrel(红隼)

    Java Sound API

    Jar文件索引

    对Java的各个方面都做了大量优化和增强

JDK 1.4

2004-02-06 Merlin(隼)

    XML处理

    Java打印服务

    Logging API

    Java Web Start

    JDBC 3.0API

    断言

    Preferences API

    链式异常处理

    支持IPV6

    支持正则表达式

    引入Image I/O API

JDK 1.5新特性

2004-9-30(Tiger)老虎

    泛型

    增强循环,可以使用迭代方式

    自动装箱与自动拆箱

    类型安全的枚举

    可变参数

        底层就是一个数组,根据参数个数不同,会创建不同长度的数组

        在传递时可以直接传递数组(传递数组后就不能再传递其余可变参数)

    静态引入

    元数据(注解)

    Instrumentation

JDK 1.6

2006-12-11 Mustang(野马)

    支持脚本语言

    JDBC 4.0API

    Java Compiler API

    可插拔注解

    增加对Native PKI(Public Key Infrastructure),Java GSS(Generic Security Service)

    Kerberos和LDAP(Lightweight Directory Access Protocol)支持

    继承Web Services

JDK 7新特性:

2011-07-28 Dolphin(海豚)

1.switch支持字符串变量

2.泛型实例化类型自动推断

    ArrayList<String> list = new ArrayList<>();

3.新的整数字面表达方式 "ob"前缀 和 "_"连接符

    1.表示二进制字面值的前缀ob

        以下三个值相同

        byte b1 = ob00100001;

        byte b2 = 0x21;

        byte b3 = 33;

    2.字面常量数字的下划线.用下划线连接整数提升其可读性,自身无含义,不可用在数字的起始和末尾

        Java编码语言对给数值型的字面值加下划线有严格的规定。如上所述,你只能在数字之间用下划线。你不能用把一个数字用下划线开头,或者已下划线结尾。这里有一些其它的不能在数值型字面值上用下划线的地方:

            在数字的开始或结尾

            对浮点型数字的小数点附件

            F或L下标的前面

            该数值型字面值是字符串类型的时候  

            float pi1 = 3_.1415F; // 无效的; 不能在小数点之前有下划线

            float pi2 = 3._1415F; // 无效的; 不能在小数点之后有下划线

            long socialSecurityNumber1=999_99_9999_L;//无效的,不能在L下标之前加下划线

            int a1 = _52; // 这是一个下划线开头的标识符,不是个数字

            int a2 = 5_2; // 有效

            int a3 = 52_; // 无效的,不能以下划线结尾

            int a4 = 5_______2; // 有效的

            int a5 = 0_x52; // 无效,不能在0x之间有下划线

            int a6 = 0x_52; // 无效的,不能在数字开头有下划线

            int a7 = 0x5_2; // 有效的 (16进制数字)

            int a8 = 0x52_; // 无效的,不能以下划线结尾

            int a9 = 0_52; // 有效的(8进制数)

            int a10 = 05_2; // 有效的(8进制数)

            int a11 = 052_; // 无效的,不能以下划线结尾

4.在单个catch块中捕获多个异常,以及用升级版的类型检查重新抛出异常

    catch代码块得到了升级,用以在单个catch块中处理多个异常,如果你要捕获多个异常并且它们包含相似的代码,使用这一特性会减少代码重复

    catch(IOException | SQLException | Exception ex) {

    

    }

    这种情况下ex变量是final的

5.try-with-resources语句

    try-with-resources语句是一个声明一个或多个资源的try语句,一个资源作为一个对象,必须在程序结束后关闭

    try-with-resources语句确保在语句的最后每个资源都被关闭,任何实现了Java.lang.AutoCloseable和java.io.Closeable的对象都可以使用try-with-resource来实现异常处理和关闭资源

    try-with-resource可以声明多个资源(声明语句之间用分好分割,最后一个可忽略分号)

    try (流创建等需要关闭的资源打开操作,多个之间用;隔开) {操作} catch(Exception 这里可加catch可不加) {}

引入JavaNIO.2开发包

null值的自动处理

JDK 1.8

2014-03-18

    Lambda表达式 

        Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

    方法引用 

        方法引用提供了非常有用的语法,可以直接引用已有的Java类或对象(实例)的方法或构造器.

        与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码

    默认方法

        默认方法就是一个在接口里面有了一个实现的方法

    新工具

        新的编译工具 如:Nashorn引擎 jjs 类依赖分析器jdeps

    Stream API

        新添加的Stream API(java.utils.stream)把真正的函数式编程风格引入到Java中

    Data Time API

        加强对日期与时间的处理

    Optional类

        Optional类已经成为Java8类库的一部分,可用来解决空指针异常

    Nashorn,JavaScript引擎

        Java8提供了一个新的Nashorn JavaScript引擎,它允许我们在JVM上运行特定的JavaScript应用

JDK 9新特性:

    2017-9-22

    模块系统

        模块是一个包的容器,Java9最大的变化之一是引入了模块系统(Jigsaw项目)

    REPL(JShell)

        交互式编程环境

        在cmd中输入JShell 可以帮你自动创建类

        以及运行一些简单的方法

    HTTP2客户端

        HTTP/2标准是HTTP协议的最新版本,新的HTTPClient API支持WebSocket和HTTP2流以及服务器推送特性

    改进的Javadoc

        Javadoc现在支持在API文档中的进行搜索,另外Javadoc的输出现在符合兼容HTML5标准

    多版本兼容Jar包

        多版本兼容Jar功能能让你创建仅在特定版本的Java环境中运行库程序时选择使用的class版本

    集合工厂方法

        List,Set和Map接口中,新的静态工厂方法可以创建这些集合的不可变实例

    私有接口方法

        在接口中使用private私有方法.我们可以使用private访问修饰符在接口中编写私有方法

    进程API

        改进的API来控制和管理操作系统进程.改进java.lang.ProcessHandle及其嵌套接口info来让开发者逃离时常因为要获取一个本地进程的PID而不得不适用本地代码的窘境

    改进的Stream API

        改进的Stream API添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询

    改进 try-with-resources

        如果你已经有一个资源是final或等效于final变量,您可以在try-with-resources语句中使用该变量,而无需再try-with-resources语句中声明一个新变量

    改进的弃用注解@Deprecated

        可以标记Java API的状态 可以表示被标记的API将会被移除,或者已被破坏

    改进钻石操作符(Diamond Operator)

        匿名类可以使用钻石操作符(Diamond Operator)

    改进Optional类

        java.util.Optional添加了很多新的有用方法,Optional可以直接转为stream

    多分辨率图像API

        定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了

    改进的CompletableFuture API

        CompletableFuture类的异步机制可以在ProcessHandle.onExit方法退出时执行操作

    轻量级的JSON API

        内置了一个轻量级的JSON API

    响应式流(Reactive Streams)API

        Java9中引入了新的响应式流API来支持Java9中的响应式编程

    模块化

        可定制JRE:更小的运行时镜像

        更确定的模块依赖关系:避免Jar Hell问题

        与 OSGI 的比较

    模块的定义:

        模块是一个命名的,自我描述的代码和数据的集合

        模块的代码被组织成多个包,每个包中包含Java类和接口

        模块的数据则包括资源文件和其他静态信息

    模块声明文件

        模块声明文件:module-info.java

        新的关键字:module 声明一个模块

        模块名称的规则 与Java包的命名规则相似

Java 10

2018-3-21

    JEP286,var局部变量类型推断

    JEP296,将原来用Mercurial管理的众多JDK仓库代码,合并到一个仓库中,简化开发和管理过程

    JEP304,统一的垃圾回收接口

    JEP307,G1垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟

    JEP310,应用程序类数据(AppCDS)共享,通过跨进共享通用类元数据来减少内存占用空间,和减少启动时间

    JEP312,ThreadLocal握手交互.在不进入到全局JVM安全点(Safepoint)的情况下,对线程执行回调,优化可以只停止单个线程,而不是停全部线程或一个都不停

    JEP313,移除JDK中附带的javah工具,可以使用javac -h代替

    JEP314,使用附加的Unicode语言标记扩展

    JEP317,能将堆内存占用分配给用户指定的备用内存设备

    JEP317,使用Graal基于Java的编译器,可以预先把Java代码编译成本地代码来提升效能

    JEP318,在OpenJDK中提供一组默认的根证书颁发机构证书,开源目前Oracle提供的JavaSE的根证书,这样OpenJDK对开发人员使用起来更方便

    JEP322,基于时间定义的发布版本,即上述提到的发布周期,版本号为...分别是大版本,中间版本,升级包和补丁版本

Java 11

2018-09-25

    181:Nest_Based访问控制

    309:动态类文件常量

    315:改善Aarch64 intrinsic

    318:无操作垃圾收集器ZGC

    320:消除Java EE和CORBA模块

    321:HTTP客户端(标准)

    323:局部变量的语法?参数

    324:Curve25519和Curve448关键协议

    327:Unicode 10

    328:飞行记录器

    329:ChaCha20和Poly1305加密算法

    330:发射一列纵队源代码程序

    331:低开销堆分析

    332:传输层安全性(Transport Layer Security,TLS)1.3

    333:动作,一个可伸缩的低延迟垃圾收集器(实验)

    335:反对Nashorn JavaScript引擎

    336:反对Pack200工具和API

Java12

2019-3-19

    在Java12中,switch可以有返回值 并且使用->直接

    break可以携带返回值,如果需要break返回值,则需每一个case后都有返回值或者抛出一个异常

    int num = switch(value) {

    case 1 ->1;

    case 2 ->2;

    case 3,4 ->3;

    case 5: break 5;

    case 6 -> {System.out.println("hello world");//没有返回则抛出异常}

    }

Java13

2019-9-17

    Java13中,switch支持如下写法

        int date = switch (day) {

        case MONDAY, FRIDAY, SUNDAY : yield 6;

        case TUESDAY                : yield 7;

        case THURSDAY, SATURDAY     : yield 8;

        case WEDNESDAY              : yield 9;

        default                     : yield 1; // default条件是必须的

        };

    支持文本块 使用三个"""

        起始的"""结尾必须换行

        String text = """

        hello world

        ! """

        文本块是在13中是预览功能,使用前需要先启用

        手动编译:

            javac --release 13 --enable-preview ...

        手动运行

            java --enable-preview ...

Java14

2020-3-17

    改进的switch表达式在14中获得了完全的支持

    instanceof支持模式匹配(语言特性 预览特性)

        使用instanceof和instanceof里的对象不用强转了

    NullPointerException(JVM特性)

        14的这个异常更加详细,精确到某个属性

    Record(预览功能)

        java14提供了解决get,set,toString等代码冗余,

        Record会提供equals,hashCode,toString方法的实体,可以重构如下

        public record Clazz(int a,double b,String c) {}

        通过record,可以自动地得到equals,hashCode,toString的实现,还有构造器和getter方法

    文本块中加入 \ 可以不换行

Java15

2020-9-15

    文本块转正

    ZGC垃圾回收器转正

    Shenandoah转正

    移除 Nashorn JavaScript Engine(JDK脚本执行引擎)

        在JDK11标记过期,15完全移除

    CharSequence新增isEmpty默认方法

Java16

2021-3-16

    向量API(孵化)

        提供了jdk.incubator.vector来用于矢量计算

    启用c++ 14 语言特性

    从Mercurial迁移到Git

    迁移到GitHub(将OpenJDK源码的版本控制迁移到github上)

    ZGC 并发线程堆栈处理

    Unix-Domain 套接字通道

        为socket channel和server-socket channel api增加Unix-domain(AF_UNIX)套接字支持。

    Alpine Linux Port

    Elastic Metaspace

    Windows/AArch64 Port

    Foreign Linker API(孵化)

        提供jdk.incubator.foreign来简化native code的调用

    基于值的类的警告

        提供注解 @jdk.internal.ValueBased 来用于标注作为value-based的类

        将原始包装类指定为基于值的类,并弃用它们的构造函数以便删除,并提示新的弃用警告。提供关于在Java平台中任何基于值类的实例上进行同步的警告。

    打包工具

        在JDK 16中转正,从 jdk.incubator.jpackage 转为 jdk.jpackage

        用于打包自包含的Java应用程序

    外部内存访问API(第三次孵化)

        引入一个API,允许Java程序安全有效地访问Java堆之外的外部内存

    为 instanceof 进行模式匹配

        在JDK 16中转正,可以如下使用

        Object o = new String("");

        if (o instanceof String str) {

            System.out.println(str.concat("模式匹配"));

        }

    Records

        在JDK 16中转正

    对内部API进行更多封装,鼓励开发者从使用内部的方法迁移到标准API

    Sealed Classes

Java17(LTS)

2021-9-14

发行说明: https://www.oracle.com/java/technologies/javase/17-relnote-issues.html

  • Sealed Classes(密封类)
    • 已将密封类添加到Java语言中。密封类和接口限制其他类或接口可以扩展或实现它们。
    • 密封类由JEP360提出,并在JDK15中作为预览特性提供。JEP 397再次提出了这些建议,并进行了改进
  • Pattern Matching for switch (Preview)
    • 使用开关表达式和语句的模式匹配以及模式语言的扩展来增强Java编程语言。
    • 通过将模式匹配扩展到switch,可以针对多个模式对表达式进行测试,每个模式都有一个特定的操作,因此可以简洁而安全地表达复杂的面向数据的查询。
  • New macOS Rendering Pipeline(新的MacOS渲染管道)
    • Swing API用于渲染的Java 2D API现在可以使用新的Apple Metal加速渲染API for macOS。
    • 这在默认情况下目前是禁用的,因此渲染仍然使用OpenGL API,虽然Apple不推荐使用这些API,但它们仍然可用并受支持。
    • 要启用Metal,应用程序应通过设置系统属性指定其用途:-Dsun.java2d.metal=true
    • Metal或OpenGL的使用对应用程序是透明的,因为这是内部实现的差异,对JavaAPI没有影响。
    • 金属管道需要macOS 10.14.x或更高版本。在早期版本上设置它的尝试将被忽略。
  • New API for Accessing Large Icons
    • JDK 17中提供了一种新方法
      • javax.swing.filechooser.FileSystemView.getSystemIcon(File,int,int)
      • 它可以在可能的情况下访问更高质量的图标。
    • 它在Windows平台上完全实现;但是,在其他平台上的结果可能会有所不同,稍后将进行增强。例如,通过使用以下代码:
    • FileSystemView fsv = FileSystemView.getFileSystemView();
      Icon icon = fsv.getSystemIcon(new File("application.exe"), 64, 64);
      JLabel label = new JLabel(icon);
    • 用户可以为“application.exe”文件获取更高质量的图标。
    • 此图标适用于创建可在高DPI环境中更好缩放的标签。
  • DatagramSocket Can Be Used Directly to Join Multicast Groups
    • 在此版本中,java.net.DatagramSocket已更新,以添加对加入多播组的支持。
    • 它现在定义了joinGroup和leaveGroup方法来加入和离开多播组。
    • java.net.DatagramSocket的类级API文档已经更新,以解释如何配置普通DatagramSocket并使用它加入和退出多播组。
    • 此更改意味着DatagramSocket API可以用于多播应用程序,而无需使用传统的java.net.MulticastSocket API。
    • MulticastSocket API与以前一样工作,尽管它的大多数方法都不推荐使用。
    • 有关这一变化的基本原理的更多信息,请参见CSR JDK-8260667。
  • Add support for UserDefinedFileAttributeView on macOS(在macOS上添加对UserDefinedFileAttributeView的支持)
    • macOS上的文件系统提供程序实现已在此版本中更新,以支持扩展属性。
    • 现在可以使用java.nio.file.attribute.UserDefinedFileAttributeView API获取文件扩展属性的视图。
    • 以前的JDK版本不支持此(可选)视图。
  • Enhanced Pseudo-Random Number Generators(增强型伪随机数发生器)
    • Provide new interface types and implementations for pseudorandom number generators (PRNGs), including jumpable PRNGs and an additional class of splittable PRNG algorithms (LXM).
    • 为伪随机数生成器(PRNG)提供新的接口类型和实现,包括可跳线PRNG和附加的可拆分PRNG算法(LXM)。
  • Modernization of Ideal Graph Visualizer(理想图形可视化仪的现代化)
  • Source Details in Error Messages(错误消息中的源详细信息)
  • New Page for "New API" and Improved "Deprecated" Page(“新API”的新页面和改进的“弃用”页面)
  • Foreign Function & Memory API (Incubator)(外部函数和内存API(孵化器))
  • Console Charset API(控制台字符集API)
    • 已更新java.io.Console以定义一个新方法,该方法返回控制台的字符集。
    • 返回的字符集可能不同于从Charset.defaultCharset()方法返回的字符集。
    • 例如,它返回IBM437,而Charset.defaultCharset()在windows上返回windows-1252(en-US)。有关更多详细信息,请参阅CSR。
  • Flight Recorder Event for Deserialization(用于反序列化的飞行记录器事件)
  • Implement Context-Specific Deserialization Filters(实现特定于上下文的反序列化过滤器)
  • 弃用 Applet API 以进行删除
    • 它基本上无关紧要,因为所有 Web 浏览器供应商都已取消对 Java 浏览器插件的支持或宣布了这样做的计划。
    • Java 9 中的JEP 289先前已弃用 Applet API,但并未将其删除。
  • 弃用安全管理器以进行删除
    • 安全管理器和与其相关的 API 已被弃用,并将在未来版本中删除。
    • 为确保开发人员和用户知道安全管理器已被弃用,如果通过java -Djava.security.manager.
    • 如果通过System::setSecurityManagerAPI动态启用安全管理器,Java 运行时还会在运行时发出警告。无法禁用这些警告。
  • 弃用 Kerberos 中的 3DES 和 RC4
  • 弃用套接字实现工厂机制
    static void ServerSocket.setSocketFactory?(SocketImplFactory fac)
    static void Socket.setSocketImplFactory?(SocketImplFactory fac)
    static void DatagramSocket.setDatagramSocketImplFactory?(DatagramSocketImplFactory fac)
    • 以下用于设置系统范围套接字实现工厂的静态方法已被弃用:
  • 弃用 JVM TI 堆函数 1.0

Java18

2022-03-22

发行说明:https://www.oracle.com/java/technologies/javase/18-relnote-issues.html

[用于核心库改进和更新]

  • 默认编码UTF-8(java.nio.charsets)

从 JDK 18 开始,UTF-8 是 Java SE API 的默认字符集.

依赖于默认字符集的 API 现在在所有 JDK 实现中表现一致,并且独立于用户的操作系统、语言环境和配置

  • 简单的 Web 服务器(java.net)

jwebserver, 一个用于启动最小静态 Web 服务器的命令行工具, 已经被引入.
该工具和随附的 API 位于 jdk.httpserver 模块的 com.sun.net.httpserver 包中,旨在用于原型设计、临时编码和测试,尤其是在教育环境中。

  • 使用方法句柄重新实现核心反射(java.lang:reflect)

使用方法句柄重新实现核心反射。依赖于现有实现的高度实现特定和未记录方面的代码可能会受到影响。可能出现的问题包括:

        检查内部生成的反射类(例如 的子类MagicAccessorImpl)的代码不再有效,必须更新。

        尝试破坏封装并将 的私有 finalmodifiers字段Method的值更改为Field与Constructor基础成员不同的类的代码可能会导致运行时错误。必须更新此类代码。

为了减轻这种兼容性风险,您可以启用旧实现作为解决方法

方法是使用 -Djdk.reflect.useDirectMethodHandle=false.

我们将在未来的版本中删除旧的核心反射实现。-Djdk.reflect.useDirectMethodHandle=false解决方法将在此时停止工作。

  • 互联网地址解析 SPI(java.net)

为主机名和地址解析引入服务提供者接口 (SPI),以便 java.net.InetAddress 可以使用平台内置解析器以外的解析器。这个新的 SPI 允许替换操作系统的本地解析器,该解析器通常配置为使用本地主机文件和域名系统 (DNS) 的组合。

[用于工具改进]

  • Java API文档中的代码片段(javadoc)

为 JavaDoc 的标准 Doclet 添加了一个 @snippet 标记,以简化在 API 文档中包含示例源代码。

[用于预览和孵化器]

  • Vector API(第三个孵化器)(核心库)

引入一个 API 来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。

  • 外部函数和内存 API(第二个孵化器)(核心库)

引入一个 API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而不会出现脆弱性和危险。 JNI。

[规范/语言]

  • switch 的模式匹配(第二次预览)

通过对 switch 表达式和语句的模式匹配以及对模式语言的扩展来增强 Java 编程语言。将模式匹配扩展到 switch 允许针对多个模式测试表达式,每个模式都有特定的操作,因此可以简洁安全地表达复杂的面向数据的查询。

Java19

2022-09-20

发行说明:https://www.oracle.com/java/technologies/javase/19-relnote-issues.html

[主要新功能]

[并发模型更新预览]

  • JEP 425虚拟线程(预览)

将虚拟线程引入Java平台。虚拟线程是轻量级线程,可以大大减少编写、维护和观察高吞吐量并发应用程序的工作量。这是一个预览API。

  • JEP 428结构化并发(孵化器)

通过引入结构化并发API简化多线程编程。结构化并发将在不同线程中运行的多个任务视为单个工作单元,从而简化错误处理和消除,提高可靠性,增强可观察性。这是一个孵化API。

[语言功能预览]

  • JEP 405 Recoord模式(预览)

使用Record模式增强Java编程语言,以解构记录值。可以嵌套Record模式和类型模式,以实现强大、声明性和可组合的数据导航和处理形式。这是一个预览语言功能。

  • JEP 427 switch模式匹配(第三次预览)

使用switch表达式和语句的模式匹配增强Java编程语言。将模式匹配扩展到switch允许根据多个模式对表达式进行测试,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。这是一个预览语言功能。


[Libraries 预览/孵化器]

  • JEP 424外部函数和内存API(预览)

引入一个API,通过该API,Java程序可以与Java运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即JVM外部的代码),并通过安全地访问外部内存(即不由JVM管理的内存),API使Java程序能够调用本机库并处理本机数据,而不会出现JNI的脆弱性和危险性。这是一个预览API。

  • JEP 426 Vector API(第四培养箱)

引入一个API来表示向量计算,该API在运行时可靠地编译为支持的CPU架构上的最优向量指令,从而实现优于等效标量计算的性能。


[新功能]-增强功能


[core-libs/java.lang]

  • 支持Unicode 14.0

java.lang.Character类支持14.0级的Unicode字符数据库,该数据库增加了838个字符,总共144697个字符。这些新增内容包括5个新脚本,总共159个脚本,以及37个新表情符号字符。

  • 新的System.properties, System.out和System.err

这些系统属性的值是标准输出和标准错误流(system.out和system.err)使用的编码。

[core-libs/java.net]

  • 对Java GSS/Kerberos的HTTPS通道绑定支持

[core-libs/java.time]

  • 增加 Date-Time 格式
  • java.time.format中引入了 java.time.format.DateTimeFormatter/DateTimeFormatterBuilder 类

[core-libs/java.util:collections]

  • 创建预分配哈希映射和哈希集的新方法
  • 引入了新的静态工厂方法,允许创建预先分配的HashMap和相关实例,以容纳预期数量的映射或元素。

[security-libs/java.security]

  • Windows KeyStore更新为包括对本地计算机位置的访问
  • 在X509Certificate::getSubjectAlternativeNames和X509Certificate::getIssuerAlternationalNames中分解序列

[security-libs/javax.net.ssl]

  • TLS签名方案

[security-libs/jdk.security]

  • 向jarsigner添加-providerPath选项

[hotspot/compiler]

  • 支持Linux/AArch64上的PAC-RET保护

[hotspot/runtime]

  • CDS档案的自动生成

……

        
[删除的功能和选项]

  • 删除诊断标志GCParallelVerificationEnabled
  • 删除SSLSocketImpl中的终结器实现
  • 删除Subject::current和Subject::callAs API的替代线程本地实现

    
[不推荐的功能和选项]

  • java.lang.ThreadGroup已降级
  • Locale 类构造函数的弃用
  • PSSParameterSpec(int)构造函数和DEFAULT静态常量已弃用
  • OAEPParameterSpec类DEFAULT静态常量已弃用

Java20

2023-03-21

发行说明:https://jdk.java.net/20/release-notes

除了数千次性能、稳定性和安全性更新外,Java 20还提供了数十项新功能和增强功能,其中七项增强功能的重要性足以保证他们自己的JDK增强建议(JEP),包括四项预览功能和三项孵化器功能。

[新功能]

[TLS Key Exchange Named Groups]
[security-libs/javax.net.ssl]
新的API javax.net.ssl.SSLParameters.getNamedGroups() 和 javax.net.ssl.SSLParameters.setNamedGroups()
[如果检测到错误的java.io.tmpdir设置,则打印标准错误警告]
[core-libs/java.lang]
[支持Unicode 15.0]
[core-libs/java.lang]
[Add GarbageCollectorMXBean for Remark and Cleanup Pause Time in G1]
[hotspot/gc]
一个名为“G1并发GC”的新GarbageCollectorMXBean已添加到G1垃圾收集器中。
[新JFR事件:jdk.InitialSecurityProperty、jdk.SecurityProviderService]
[Provide Poly1305 Intrinsic on x86_64 platforms with AVX512 instructions]
[在x86_64和aarch64平台上提供ChaCha20 Intrinsics]
[新的“jmod--compression”命令行选项]

jmod工具中添加了一个新的--compression命令行选项,用于在创建jmod归档时指定压缩级别。可接受的值是zip-[0-9],其中zip-0不提供压缩,而zip-9提供最佳压缩。默认为zip-6。

[Javac警告复合赋值中的类型转换可能有误]
javac中添加了新的lint选项有损转换,以警告可能有损转换的复合赋值中的类型转换。如果复合赋值的右侧操作数的类型与变量的类型不兼容,则隐含强制转换,并且可能发生有损转换。

可以使用 @SuppressWarnings("lossy-conversions") 来抑制新的警告。

[删除的功能和选项]

[Thread.shupend()、Thread.resume()、Thread.stop()更改为抛出UnsupportedOperationException异常]

[G1并发细化线程的控制已被完全取代]

[删除对javac-source/-target/-版本7的支持]

[弃用的功能和选项]

[java.net.URL构造函数已弃用]

[弃用用于删除的JMX Management Applets]

[其他注意事项]

[HTTP响应的读取流在中断时抛出IOException]

[HttpClient默认保持活动时间为30秒]

[添加了HTTP/2的空闲连接超时]

Java21(LTS)

2023-09-19

发行说明:https://www.oracle.com/java/technologies/javase/21-relnote-issues.html

openjdk(包括详细功能等):https://openjdk.org/projects/jdk/21/

[主要新功能]

[语言特点]

记录模式(record关键词),参见JEP440:https://openjdk.org/jeps/440

switch的匹配,参见JEP441:https://openjdk.org/jeps/441

switch支持返回值了,还可以case null了,可以使用 -> 替代 break,支持 case when的格式等

[功能预览]

字符串模板,参见JEP430:https://openjdk.org/jeps/430

Unnamed Patterns and Variables,参见JEP443:https://openjdk.org/jeps/443

使用匿名模式和匿名变量来增强Java语言,匿名模式匹配record而不用说明组件名称或类型,匿名变量可以初始化但不使用,两者都用下划线 _ 表示

Unnamed Classes and Instance Main Methods,参见JEP445:https://openjdk.org/jeps/445

JEP上的说明是为了让更加容易让初学者学习,因为初学者刚开始应首先体验到编写程序,而不需要知道类的概念,包括main的args参数等,这个功能可以像C一样编写hello,world...

[库改进]

指优化,修复或新增到库


虚拟线程,参见JEP444:https://openjdk.org/jeps/444

将虚拟线程引入Java平台。虚拟线程是轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。

就像其他语言的协程,对于使用者来说,能不使用线程尽量不使用线程...

Sequenced Collections,参见JEP431:https://openjdk.org/jeps/431

新的有序集合,对比

获取第一个元素获取最后一个元素
Listlist.get(0)list.get(list.size() - 1)
Dequedeque.getFirst()deque.getLast()
SortedSetsortedSet.first()sortedSet.last()
LinkedHashSetlinkedHashSet.iterator().next()// missing

Key Encapsulation Mechanism API,参见JEP452:https://openjdk.org/jeps/452

介绍一种用于密钥封装机制(KEM)的API,这是一种使用公钥加密来保护对称密钥的加密技术。

[预览,改进/新增]

外部函数和内存API(第三次预览)

结构化并发(预览)

作用域值(预览)

矢量API(第六个培养箱)


[性能改进]

Generational ZGC,参见JEP439:https://openjdk.org/jeps/439

通过扩展Z垃圾回收器(ZGC)来维护年轻对象和旧对象的独立生成,从而提高应用程序性能。这将使ZGC能够更频繁地收集年轻的物体——这些物体往往英年早逝。


[管理和维护]

准备禁止动态加载代理

当代理被动态加载到正在运行的JVM中时,发出警告。这些警告旨在让用户为未来的版本做好准备,该版本默认不允许动态加载代理,以提高完整性。在启动时加载代理的可维护性工具在任何版本中都不会导致发出警告。


[新功能]

[core-libs/java.lang]

  • Runtime.exec和ProcessBuilder命令参数的日志记录
  • System.exit() 和Runtime.exit() 日志记录
  • Math.clamp() 和StrictMath.clamp() 方法
  • String的indexOf增加两个新的重载,indexOf(int,int,int)与 indexOf(String,int,int)
  • Unicode表情符号属性:Character增加六种新方法 isEmoji...等
  • String和java.util.regex.Pattern增加新的函数splitWithDelimiters()

[core-libs/java.net] java.net.http.HttpClient现在可自动关闭

[core-libs/java.nio.charsets] 支持GB18030-2022

[core-libs/java.util] StringBuild和StringBuffer增加新的函数repeat

[core-libs/java.util.regex] RegEx中与表情符号相关的二进制属性

...

[删除的功能和选项]

[core-libs/java.io] java.io.File的规范路径缓存被删除

[core-libs/java.lang]

  • 删除ThreadGroup.allowThreadSuspension
  • System Property中删除 java.compiler
  • 删除java.lang.Compiler类

[core-libs/java.util.jar] 删除JAR索引功能
[core-svc/javax.management] 删除javax.management.remote.rmi.RMIIIOPServerImpl

[hotspot/gc] 删除G1热卡缓存
...

<br>

Java22

2024-03-19

JDK 22将根据这些条款接收更新,直到2024年9月,届时它将被JDK 23取代

发行说明:https://www.oracle.com/java/technologies/javase/22-relnote-issues.html

[主要新功能]

[语言特点]

Unnamed Variables & Patterns,参见JEP 456:https://openjdk.org/jeps/456

Java21的预览,在这里正式了。

未命名变量和模式,它旨在提高代码的可读性和可维护性。该特性允许开发人员在必须使用变量声明或嵌套模式,但又从未使用过这些变量或模式的情况下,使用未命名的方式来标记这些变量和模式。

在Java编程中,有时需要声明一些变量或模式,但实际上并不打算在代码中使用它们。

例如,在catch子句中,需要声明一个异常变量,但实际上并不打算对其进行任何操作。在这种情况下,使用未命名变量和模式可以使代码更加简洁和清晰。

例如 for-each:for (Test _ : tests) {}

未命名变量和模式使用下划线字符“_”来表示。

[语言预览]

Statements before super(...) (Preview),参见JEP 447:https://openjdk.org/jeps/447

JEP 447是Java平台的一个改进提案(Java Enhancement Proposal),其主要目标是放宽Java构造函数中对语句顺序的限制,特别是在构造函数中显式调用另一个构造函数(即super调用)之前的语句限制。

在传统Java中,要求构造函数中对另一个构造函数的显式调用(即super调用)必须是第一条语句。这个限制确保了构造函数的执行顺序是自上而下的,并防止了在超类构造函数完成其初始化工作之前访问未初始化的字段。然而,这种限制也限制了构造函数逻辑的表达性和可读性,因为有时我们可能需要在super调用之前执行一些不引用正在创建的实例的语句。

JEP 447放宽了这些限制,允许在显式调用super之前出现不引用正在创建的实例的语句。这意味着,现在可以在辅助方法、中间构造函数或构造函数参数之前执行某些逻辑,而这些逻辑之前必须放在super调用之后。

Stream Gatherers (Preview),参见 JEP 461:https://openjdk.org/jeps/461

JEP 461的引入使得流处理更加简洁和直观。在以前的Java版本中,虽然也可以对流进行聚合操作,但通常需要编写额外的代码或使用第三方库来实现。现在,通过内置的流聚合器,开发者可以直接在流上调用相应的聚合方法,从而简化了代码并提高了可读性。

假设我们有一个整数列表,我们想要计算这个列表中所有数字的总和。在Java 8及以后的版本中,我们可以使用流(Stream)来实现这个功能。但在JEP 461之前,我们可能需要这样写代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println("总和: " + sum);

在之后,可以直接

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().sum();

字符串模板 (二次预览),参见JEP459:https://openjdk.org/jeps/459

Implicitly Declared Classes and Instance Main Methods (二次预览),参见JEP463:https://openjdk.org/jeps/463

同 Java21 的Unnamed Classes and Instance Main Methods JEP445

[库]

外部函数和内存API,这里正式了,参见 JEP454:https://openjdk.org/jeps/454

[库预览和孵化器]

类文件API(预览),参见JEP457:https://openjdk.org/jeps/457

提供一个标准的API,用于解析、生成和转换Java类文件。

Structured Concurrency(二次预览),参见JEP462:https://openjdk.org/jeps/462

通过引入用于结构化并发的API来简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和消除,提高可靠性,并增强可观察性

Scoped Values (二次预览),参见JEP464:https://openjdk.org/jeps/464

引入作用域值,使不可变数据能够与同一线程中的子帧和子线程进行托管共享。作用域值比线程本地变量更容易推理,并且空间和时间成本更低,尤其是与虚拟线程和结构化并发结合使用时。

Vector API (Seventh Incubator),参见JEP460:https://openjdk.org/jeps/460

引入API来表示向量计算,这些向量计算在运行时可靠地编译为支持的CPU架构上的最佳向量指令,从而实现优于等效标量计算的性能。

[新功能]

支持Unicode 15.1

TCP_KEEPxxxx扩展套接字选项现在在Windows平台上受支持

32位UTF字符集的新常量,java.nio.charset中的以下三个新常量。StandardCharsets类已经引入:UTF_32,UTF_32BE,UTF_32LE

区域设置相关列表模式

基于UnicodeConsortium的LDML规范,引入了一个新的类ListFormat,它处理与区域设置相关的列表模式。例如,由三个字符串组成的列表:“Foo”、“Bar”和“Baz”在美式英语中通常格式化为“Foo,Bar,and Baz”,而在法语中则格式化为“Foo,Bar et Baz”

ListFormat.getInstance().format(List.of("Foo", "Bar", "Baz"))

java.util.random.RandomGenerator新增equiDoubles()函数

HSS/LMS:密钥工具和jarsigner更改

jarsigner和keytool工具已经更新,以支持分层签名系统/雷顿-米卡利签名(HSS/LMS)签名算法。jarsigner支持使用HSS/LMS对JAR文件进行签名,并验证使用HSS/LMS签名的JAR文件,而keytool支持生成HSS/LMS密钥对。

将Java的XML Security更新到3.0.3

inheritDoc标记和方法注释算法已更改

向JDK XML模块添加内置目录

添加JDK属性以指定DTD支持

引入了一个新的属性jdk.xml.dtd.support,用于确定xml处理器如何处理dtd

@Deprecated方法的JFR事件

[删除的功能和选项]

sun.misc.Unsafe.shouldBeInitialized和ensureClassInitialized被删除

Thread.countStackFrames被删除

旧的核心反射实现已被删除

Jdeps-profile和-P选项已被删除

[弃用的功能和选项]

sun.misc.Unsafe park, unpark, getLoadAverage,和xxxFence函数已弃用,计划移除

 -Xnoagent选项已弃用,计划移除

jdk.crypto.ec模块的弃用

-Xdebug和-debug选项已弃用,计划移除

...

持续更新中...

  • 40
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Java 8 新特性包括 Lambda 表达式、函数式接口、Stream API、默认方法、Nashorn JavaScript 引擎等。Java 9 新特性包括模块化系统、JShell REPL、HTTP/2 客户端、改进的 Javadoc 等。Java 10 新特性包括局部变量类型推断、G1 垃圾收集器改进等。Java 11 新特性包括 HTTP 客户端、ZGC 垃圾收集器、Epsilon 垃圾收集器等。Java 12 新特性包括 Switch 表达式、新的垃圾收集器等。Java 13 新特性包括文本块、动态 CDS 等。Java 14 新特性包括 Switch 表达式增强、记录类型等。 ### 回答2: Java是一种面向对象的编程语言,随着时间的推移,它经历了多个版本的升级和改进。下面是Java各个版本新特性的简要介绍。 Java 1.1:引入了内部类、JavaBeans、JDBC和RMI等新特性,提供了更强大的功能和更好的性能。 Java 1.2:引入了Swing图形库,增加了对Unicode字符集的支持,添加了集合框架和迭代器等功能,提供了更丰富的编程工具。 Java 1.3:引入了自动垃圾回收、JNDI、JAXP和Java Sound等新特性,提升了性能、安全性和可扩展性。 Java 1.4:引入了正则表达式、NIO和断言等新特性,增强了网络编程和异常处理的功能。 Java 5(Java 1.5):引入了泛型、自动装箱/拆箱、枚举、注解和可变参数等新特性,提升了代码的可读性和编程效率。 Java 6(Java 1.6):引入了JDBC 4.0、桌面GUI改进和XML Web Services等新特性,提供了更好的性能和稳定性。 Java 7(Java 1.7):引入了Switch语句支持String、二进制整数表示和Fork/Join等新特性,增加了异常处理和并发编程的功能。 Java 8(Java 1.8):引入了Lambda表达式、Streams API、新的日期和时间API等新特性,提升了代码的简洁性和函数式编程能力。 Java 9(Java 9):引入了模块化系统(Java模块系统)、JShell、新的G1垃圾收集器等新特性,优化了应用程序的性能和可扩展性。 Java 10(Java 10):引入了局部变量类型推断、JEP 286和JEP 296等新特性,提供了更好的开发工具和性能优化。 Java 11(Java 11):引入了HTTP/2和底层平台API等新特性,提升了性能和安全性。 Java 12(Java 12):引入了Switch表达式、新的G1垃圾收集器优化等新特性,提供了更好的开发工具和性能优化。 Java 13(Java 13):引入了文本块、Switch表达式增强等新特性,提升了代码的可读性和运行效率。 Java 14(Java 14):引入了Pattern Matching for instanceof、Switch表达式增强等新特性,简化了代码并提升了开发效率。 Java的各个版本通过引入新特性来提升语言的功能和性能,使得开发人员能够更加高效地编写代码。不断的改进和升级使得Java成为一种受欢迎的编程语言。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HackShendi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值