轩辕李的博客 轩辕李的博客
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • HTML&CSS
  • JavaScript
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

轩辕李

勇猛精进,星辰大海
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • HTML&CSS
  • JavaScript
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

    • 核心

      • Java8--Lambda 表达式、Stream 和时间 API
      • Java集合
      • Java IO
      • Java 文件操作
      • Java 网络编程
      • Java运行期动态能力
      • Java可插入注解处理器
      • Java基准测试(JMH)
      • Java性能分析(Profiler)
      • Java调试(JDI与JDWP)
      • Java管理与监控(JMX)
      • Java加密体系(JCA)
      • Java服务发现(SPI)
      • Java随机数生成研究
      • Java数据库连接(JDBC)
      • Java历代版本新特性
        • 前言
        • 1.1
          • 核心特性
          • 其他重要改进
        • 1.2
          • 革命性特性
        • 1.3
          • 性能革命
          • 企业级功能
          • 其他重要特性
        • 1.4
        • 5.0
        • 6
          • 命名变化
          • 核心特性
          • Web服务和企业级功能
          • 性能和GUI改进
          • 其他特性
        • 7
          • JVM重大改进
        • 8(LTS)
          • 核心特性
          • 其他重要特性
        • 9
          • 革命性特性
          • 性能和底层改进
        • 10
        • 11(LTS)
          • 核心特性
          • 重要变化
          • 新API和增强
          • 其他特性
          • API变化
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17(LTS)
          • 核心特性
          • 其他重要特性
        • 18
        • 19
        • 20
        • 21(LTS)
          • 核心特性
          • 其他重要特性
          • 平台支持变化
        • 22
        • 23
        • 24
          • 重要正式特性
          • 量子计算抵抗
          • 性能优化
          • ZGC改进
          • 平台支持变化
          • 安全性增强
          • 继续预览的特性
          • 其他特性
        • 其他
      • 写好Java Doc
      • 聊聊classpath及其资源获取
    • 并发

    • 经验

    • JVM

    • 企业应用

  • Spring

  • 其他语言

  • 工具

  • 后端
  • Java
  • 核心
轩辕李
2023-06-22
目录

Java历代版本新特性

# 前言

Java从1995年诞生至今,已经走过了近30年的发展历程。特别是从2017年9月Java 9发布开始,Java版本的发布周期从之前的每两年一个新版本缩减到每六个月一个新版本,Java的变化开始迅猛起来。

本文从Java 1.1版本开始,系统梳理了Java各个版本的核心特性和发展脉络。对于每个版本,我们会重点介绍那些影响深远的特性,同时也会涉及一些重要的API变化和性能改进。

阅读建议:

  • 标记为 粗体 的特性通常是该版本最重要的改进
  • LTS(长期支持)版本建议重点关注
  • 代码示例可以帮助你快速理解新特性的用法

# 1.1

1997年2月19日发布 (opens new window)。

Java 1.1是Java的第一个重大更新,引入了许多至今仍在使用的核心概念。

# 核心特性

  • JavaBeans API:引入了组件化编程的概念,允许开发可重用的组件,“一次编写,处处运行”
  • AWT大幅改进:采用全新的事件模型和GUI架构,提供更好的用户界面开发能力
  • JDBC API:Java数据库连接标准,为数据库访问提供了统一的接口
  • RMI(远程方法调用):允许Java对象在不同的JVM之间相互调用

# 其他重要改进

  • 安全模型增强:引入了签名小程序等安全特性
  • 国际化支持:基于Unicode 2.0标准,支持多语言应用开发
  • 内部类支持:允许在类内部定义另一个类
  • 反射API:提供了运行时检查和操作类的能力

# 1.2

1998年12月8日发布 (opens new window),代号为Playground。

Java 1.2是一个里程碑式的版本,引入了“Java 2”的概念,带来了大量的新特性。

# 革命性特性

  • Java安全模型。先进的"沙箱"模型扩展,使开发人员、用户和系统管理员能够指定和管理一组灵活的安全策略,规定应用程序或小程序可以执行或不能执行的操作。Java 2平台安全模型包括以下新功能:
    • 基于策略的访问控制
    • 证书接口(X.509 V3)
  • 性能增强。Java 2平台的改进性能和响应能力包括:
    • Solaris操作环境的本机线程支持
    • 加载类的内存压缩
    • 更快的内存分配和改进的垃圾回收
    • 可插拔的虚拟机体系结构,支持其他虚拟机,包括即将推出的Java HotSpot VM
    • 新的即时编译器(JIT)
    • Java本机接口(JNI)转换
  • Java基础类(JFC)。Java基础类现已成为Java 2平台的核心,包括:
    • 项目Swing GUI组件集
    • 拖放功能
    • Java 2D API,提供新的2D和AWT图形功能以及打印支持
    • Java外观接口
    • 新的辅助功能API
  • 全球化。Java 2技术中增强的全球化为跨文化环境提供以下功能:
    • 输入法框架(支持日语、中文和韩文字符)
    • 使用Java 2D API实现复杂输出,提供日语、阿拉伯语、希伯来语和其他字符语言的双向高质量显示
  • Java插件。Java插件现已包含在Java 2平台中,为Web浏览器提供了与Java虚拟机完全兼容的运行时环境,用户可以通过广泛部署的Web浏览器进行轻松下载和安装。
  • Java接口定义语言(IDL)API。Java IDL API提供了基于标准的与CORBA的分布式计算互操作性。该API包括以下功能:
    • 调用操作或远程网络服务
    • 运行时环境中包含一个完全兼容的Java ORB
  • Java数据库连接2.0(JDBC 2.0)增强。JDBC提供更灵活的查询数据访问。可滚动的游标和对SQL3类型的支持提供了更好的性能和稳定性。
  • 集合框架。这种新的统一架构用于表示和操作集合,提高了开发效率,并允许不相关的API之间的互操作性。
  • Java 2平台是符合2000年问题的;它是一个稳定、安全和强大的环境,适用于下一个千年的关键任务计算。

# 1.3

2000年5月8日叔布 (opens new window),代号为Kestrel。

Java 1.3的最大亮点是引入了HotSpot虚拟机,大幅提升了性能。

# 性能革命

  • Java HotSpot Client VM:革命性的性能提升:
    • 启动时间缩短40%
    • 内存占用减少25%
    • 动态优化和自适应编译

# 企业级功能

  • RMI/IIOP:与CORBA系统的互操作性
  • JNDI(Java命名和目录接口):支持LDAP等目录服务
  • JPDA(Java平台调试器架构):统一的调试接口

# 其他重要特性

  • JavaSound API:内置的音频处理功能
  • 动态代理:java.lang.reflect.InvocationHandler,支持运行时代理生成
  • 安全增强:
    • RSA数字签名支持
    • 动态信任管理
    • 更强的X.509证书支持
  • Web部署改进:小程序缓存和更好的Java插件支持

# 1.4

2002年2月6日发布 (opens new window),代号为Merlin。

Java 1.4是第一个通过Java Community Process(JCP)开发的版本,标志着Java开始走向社区驱动的发展道路。这个版本引入了许多现代Java开发中不可或缺的特性。

  • 性能提升。基于使用 SPECjbb2000(Java Business Benchmark)的测试,标准性能评估公司用于衡量服务器端 Java 性能的基准测试,版本 1.4 显示比 J2SE 版本 1.3.1 提高了 58%。Java 客户端应用程序也得到了显著的改进,基于 Swing 的小程序和应用程序在 GUI 响应能力方面平均提高了 40%。
  • assert 关键字 (在 JSR 41 中被指定)
  • 仿照Perl的正则表达式
  • 异常链,允许一个异常来封装原先处于较低级别的异常
  • 支持Internet Protocol version 6 (IPv6)
  • 非阻塞I/O(取名为 Nonblocking Input/Output,NIO)(在 JSR 51中被指定)
  • 日志API (在JSR 47中被指定)
  • 图像 I/O API来读取和写入图片,支持JPEG、PNG等格式
  • 集成了XML解析器和XSLT处理器(JAXP)(指定在JSR 5和JSR 63)
  • 集成安全和加密扩展组件(JCE, JSSE, JAAS)
  • 内置了Java Web Start (Java Web Start 在2001年3月第一次被发布,作为J2SE 1.3的可选组件) (指定在JSR 56)
  • 首选项 API (java.util.prefs),存储用户和系统的偏好设置

# 5.0

2004年9月发布 (opens new window),代号为Tiger。

从此版本开始,推出了一个新的版本控制系统。

版本号"1.5.0"和"5.0"均用于标识Java 2平台标准版的此版本。"5.0"是产品版本,而"1.5.0"是开发者版本。数字"5.0"用于更好地反映J2SE的成熟度、稳定性、可扩展性和安全性。

  • 泛型(Generics): 为集合提供编译期间 (静态) 类型安全,且不须为大多数类型转换(规范在 JSR 14)
  • 元数据(Metadata): 也称作注解。让语言结构(像是类别和方法)能够用额外的资料标记,可以由元数据工具处理(规范在 JSR 175)
  • 自动封装与解封装: 在基本的资料类型(如 int)和基本的的外覆类别 (如 Integer) 之间能够自动转换 (规范在 JSR 201)
  • 枚举(Enumerations): 以 enum 关键字创造出一种类型安全,有排序值的清单(如Day.MONDAY、 Day.TUESDAY 等);以前这只能透过非类型安全的恒定整数或自行撰写的类别来达成 (类型安全的枚举模式) (规范在JSR 201)
  • 可变参数函数(Varargs):方法的最后一个参数现在可以用一个类型名称加上三个点宣告(如:void drawtext(String... lines));在调用代码中,类型中参数里任何的数字可以被使用,而它们再放在一个数组来传递给方法,或是其它的调用代码可以传递那个类型的数组
  • 强化 for each 循环:for 循环的语法被用特别的语法扩展了,适用于数组或 Iterable,用于迭代每个成员,如基本的 Collection 类别 (规范在 JSR 201)
  • 改进多线程 Java 程序的执行语义;新的 Java 存储器模型改善了复杂性、 有效性和以前的规格性能
  • 静态导入
  • 自动给RMI产生桩模块
  • Swing:新的接口外观,叫做synth
  • 异步实用工具。在 java.util.concurrent 包中。参考 Java 并发系列教程
  • Scanner类解析来自各式各样的输入和缓冲
  • 新的 ProcessBuilder 类提供了一种比 Runtime.exec 更方便的子进程调用方式。参考 Guide to java.lang.ProcessBuilder API (opens new window)

# 6

2006年12月11日发布 (opens new window),代号为Mustang。

Java 6标志着Java命名系统的重大变化,同时在性能和开发工具方面进行了大量改进。

# 命名变化

从此版本开始:

  • “J2SE”改为“Java SE”
  • “J2EE”改为“Java EE”
  • “J2ME”改为“Java ME”

# 核心特性

  • 脚本语言支持(JSR 223):内置了JavaScript Rhino引擎,支持在Java中运行脚本语言
  • Java编译器API(JSR 199):允许程序化调用Java编译器,为动态编译提供支持
  • JDBC 4.0(JSR 221):数据库访问的重大改进,支持自动驱动加载

# Web服务和企业级功能

  • JAX-WS(JSR 224):改进的Web服务支持,更容易的SOAP服务开发
  • JAXB 2.0:XML数据绑定增强,包括StAX解析器集成
  • 可插拔注解处理(JSR 269):支持编译时注解处理,参考Java运行期动态能力

# 性能和GUI改进

  • 核心平台性能提升:启动时间和运行时性能的显著改善
  • Swing增强:
    • SwingWorker正式集成到API中
    • 表格排序和过滤功能
    • 真正的双缓冲,消除显示闪烁
  • JVM优化:
    • 同步和编译器性能优化
    • 垃圾收集算法改进
    • 应用程序启动性能提升

# 其他特性

  • 兼容性:支持旧的Windows 9x系统(直到Update 7)

# 7

2011年7月28日发布 (opens new window),代号为Dolphin。

Java 7引入了许多语言级别的改进,被称为“Coin项目”,同时在JVM和库方面也有重大突破。

# JVM重大改进

  • JVM本身对动态语言的支持:新的invokedynamic字节码指令 (opens new window)(JSR-292),与多语言虚拟机(Multi Language Virtual Machine)原型
  • 64位指针压缩(Java 6 中可以使用 XX:+UseCompressedOops 开启)
  • 一些语言方面的小改变(在Coin项目下的一个小群体):
    • 在switch中使用字符串类型。例如:switch (str) {case "abc": ...}
    • try语句中的自动资源管理。例如:try (FileWriter writer = new FileWriter("file.txt")) {}
    • 针对泛型实例的创建而改善的类型推论,被称为钻石操作符<>。例如:Map<String, List<String>> myMap = new HashMap<>();
    • 简化了varargs方法的声明,可以直接使用参数类型后加上省略号...来声明可变参数
    • 二进制整数字面值,以前缀0b或0B开头。例如:int binary = 0b1001;
    • 允许在数值字面值中加入下划线。下划线可以插入在数字之间,但不能放在开头或结尾。例如:1_000_000
    • 允许在一个 catch 中捕捉多个类型的异常,并使用改进的类型检查重新抛出异常。例如:catch (IOException|SQLException ex) {throw ex;}
  • JSR 166下的并发实用工具(ForkJoinPool (opens new window)、Phaser、ConcurrentLinkedDeque和TransferQueue)
  • 新的文件 I/O 程序库 (JSR 203 定义) 增加多重文件的支持、文件原始资料和符号链接。新的包为:java.nio.file (opens new window)、java.nio.file.attribute和java.nio.file.spi
  • 使用 Timsort 来为集合与数组排序,取代归并排序
  • 对椭圆曲线加密算法增加标准库级别的支持
  • 一个给Java 2D的XRender传递途径,改进了现代GPUs特有的功能的处理
  • 用于图形功能的新平台API(最初在版本6u10中的实现为不支持的API)
  • 增强了对新网络通信协议(包括SCTP和Sockets Direct Protocol)的标准库级别的支持
  • 更新对XML和Unicode的支持,以符合最新标准
  • Java部署规则集

# 8(LTS)

2014年3月18日发布 (opens new window)。

Java 8是一个里程碑式的版本,引入了函数式编程特性,彻底改变了Java的编程范式。注意:此版本不再支持Windows XP。

# 核心特性

  • JSR 335,JEP 126:Lambda表达式和Stream API。这是Java历史上最重要的特性之一,引入了函数式编程理念:

    • Lambda表达式:(x, y) -> x + y
    • Stream API:list.stream().filter(x -> x > 0).collect(Collectors.toList())
    • 接口默认方法:允许在接口中定义默认实现,解决了接口演进的兼容性问题
    • 参考:Java8--Lambda 表达式、Stream 和时间 API
  • JSR 310,JEP 150:全新的日期时间API。基于Joda-Time重新设计,解决了旧Date API的诸多问题:

    LocalDate date = LocalDate.now();
    LocalDateTime dateTime = LocalDateTime.of(2024, 3, 15, 10, 30);
    ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
    

# 其他重要特性

  • JSR 223,JEP 174:Nashorn JavaScript引擎,允许在JVM中运行JavaScript代码
  • JSR 308,JEP 104:类型注解,支持在类型使用位置添加注解(@NonNull、@Nullable等)
  • JSR 337,JEP 120:重复注解,同一注解可以在同一位置重复使用
  • JEP 122:移除永久代,使用Metaspace替代,改善内存管理
  • 无符号整数算术支持
  • JEP 178:静态链接JNI库
  • JEP 153:JavaFX应用程序支持

# 9

2017年9月21日发布 (opens new window)。

Java 9开启了Java的新时代,引入了模块化系统,同时标志着发布周期的重大变化。

# 革命性特性

  • JSR 376: Jigsaw项目——JDK模块化 (opens new window)。这是Java历史上最大的变化之一:

    // module-info.java
    module my.module {
        requires java.base;
        exports com.example.api;
        opens com.example.internal to framework;
    }
    
    • 解决了“Classpath Hell”问题
    • 提供更好的封装性和依赖管理
    • 支持创建自定义运行时镜像
  • JEP 222: jshell——Java Shell (opens new window)。Java的REPL工具,支持交互式编程:

    $ jshell
    |  Welcome to JShell -- Version 9
    jshell> int x = 10
    x ==> 10
    jshell> System.out.println("Hello, " + x)
    Hello, 10
    

# 性能和底层改进

  • JEP 295:AOT编译(通过 GraalVM 实现)
  • JEP 268:XML Catalogs(对XML目录的支持)
  • JEP 266:更多的并发更新。包含响应式流的Java实现,及其部分替代品java.util.concurrent.Flow (opens new window)。
  • JEP 193: VariableHandles (opens new window)。提供了更安全的替代sun.misc.Unsafe的方式:
    VarHandle vh = MethodHandles.lookup()
        .findVarHandle(MyClass.class, "field", int.class);
    // 原子操作
    vh.compareAndSet(obj, expectedValue, newValue);
    
  • JEP 282: jlink (opens new window)——Java链接器。可以创建自定义运行时镜像:
    jlink --module-path $JAVA_HOME/jmods:myapp/mods \
          --add-modules myapp \
          --output myapp-runtime
    
  • JavaDB被移出JDK,其开发和维护是由Apache Derby社区负责。
  • JEP 263:高DPI图像:自动缩放与尺寸自适应。改进Java应用程序在高分辨率显示屏幕上的图像质量和表现。
  • JEP 158:Unified JVM Logging,统一的JVM日志记录 (opens new window)。提供了一种通用的日志记录系统,用于JVM组件和应用程序。
  • API变动
    • 集合工厂方法,比如List.of、Set.of、Map.of、Map.ofEntries
    • Stream API新增takeWhile、dropWhile、iterate、ofNullable、iterate方法
    • Optional新增stream方法
    • 支持接口私有方法 (opens new window)
    • Javadoc 支持 HTML5
    • 不能使用下划线 _ 作为变量名,因为它是一个关键字
    • String 存储结构变更从 char -> byte
    • 新增ProcessHandle类 (opens new window),用于简化处理进程

# 10

2018年3月20日发布 (opens new window)。

Java 10引入了一个重要的语言特性,同时在垃圾收集和平台支持方面有所改进。

  • JEP 286:局部变量类型推断(var关键字)。例如:for (var integer : list){ }
  • JEP 317:实验性的基于Java的JIT编译器。这是 Linux x64 下 Graal 动态编译器的集成。
  • JEP 310:应用程序类级别数据共享(CDS)
  • JEP 307:适用于G1的多线程完全垃圾回收。通过-XX:+UseParallelGC参数启用。
  • JEP 304:垃圾回收器接口
  • JEP 314:更多的Unicode语言标签扩展
  • JEP 319:内置根证书
  • JEP 312:线程本地握手
  • JEP 316:在可选的内存设备上申请堆内存空间
  • JEP 313:删除本地代码头文件生成器javah
  • JEP 296:将所有JDK分支集成到同一个版本库中
  • 容器意识,JVM现在知道自己在Docker容器中运行,并将提取特定于容器的配置,而不是查询操作系统本身。新增参数-XX:-UseContainerSupport、-XX:ActiveProcessorCount、-XX:InitialRAMPercentage、-XX:MaxRAMPercentage、-XX:MinRAMPercentage
  • API变动
    • 新增了Optional.orElseThrow()方法
    • 新增了Collection.copyOf()方法,拷贝之后集合不可变
    • 新增了Collectors.toUnmodifiableList()方法
    • 新增了Collectors.toUnmodifiableSet()方法
    • 新增了Collectors.toUnmodifiableMap()方法

# 11(LTS)

2018年9月25日发布 (opens new window)。

Java 11是继Java 8后的下一个LTS版本,重点在于移除旧特性和添加新的工具。

# 核心特性

  • JEP 321:标准化HTTP Client。替代第三方HTTP库,支持HTTP/2和WebSocket:

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/data"))
        .build();
    HttpResponse<String> response = client.send(request, 
        HttpResponse.BodyHandlers.ofString());
    
  • JEP 333:添加ZGC(Z Garbage Collector)。一个实验性的低延迟垃圾收集器,目标在于实现10ms以下的暂停时间

  • JEP 328:Java飞行记录器(JFR)正式开源。提供低开销的性能监控和问题诊断

# 重要变化

  • JEP 320:移除Java EE和CORBA模块,包括:

    • java.xml.ws(JAX-WS)
    • java.xml.bind(JAXB)
    • java.activation(JAF)
    • java.xml.ws.annotation(Common Annotations)
    • java.corba(CORBA)
    • java.transaction(JTA)
  • JEP 335:弃用Nashorn JavaScript引擎,为未来移除做准备

# 新API和增强

  • JEP 323:Lambda参数中支持var关键字:(var x, var y) -> x + y
  • JEP 330:单文件源码程序 (opens new window)支持:java HelloWorld.java
  • JEP 332:支持TLS 1.3协议

# 其他特性

  • JEP 181:嵌套成员访问控制 (opens new window),改善内部类访问
  • JEP 309:动态类文件常量
  • JEP 318:Epsilon无操作垃圾收集器(用于性能测试)
  • JEP 327:Unicode 10支持
  • JEP 329:ChaCha20和Poly1305加密算法
  • JEP 331:低开销堆分析

# API变化

  • String新增方法:repeat()、isBlank()、lines()、strip()
  • Files新增方法:readString()、writeString()
  • Collection新增toArray(IntFunction<T[]> generator)方法
  • Predicate新增not()静态方法,用于谓语否定

# 12

2019年3月19日发布 (opens new window)。

Java 12引入了新的垃圾收集器和模式匹配的预览功能。

  • JEP 189:Shenandoah:一个实验性的低延迟垃圾收集器
  • JEP 230:细粒度性能评审包
  • JEP 325:Switch 表达式(预览阶段)
    public static void switchJava12(String day) {
      switch (day) {
          case "march", "april", "may"            -> System.out.println("春天");
          case "june", "july", "august"           -> System.out.println("夏天");
          case "september", "october", "november" -> System.out.println("秋天");
          case "december", "january", "february"  -> System.out.println("冬天");
      }
    }
    
    String season = switch (day) {
      case "march", "april", "may"            -> "春天";
      case "june", "july", "august"           -> "夏天";
      case "september", "october", "november" -> "秋天";
      case "december", "january", "february"  -> "冬天";
      default -> {
        //throw new RuntimeException("day error")
          System.out.println("day error");
          break "day error";
      }
    };
    System.out.println("当前季节是:" + season);
    
  • JEP 334:JVM Constants API(ClassDesc, MethodTypeDesc, MethodHandleDesc, DynamicConstantDesc)
  • JEP 340:仅保留一个 AArch64 平台的移植
  • JEP 341:默认类数据共享归档
  • JEP 344:针对G1,提供可中止的混合垃圾收集
  • JEP 346:针对G1,及时释放已申请但未使用的内存
  • 支持Unicode 11,支持操作更多的表情、符号
  • API改动
    • 新增了String.indent()--调整每行开头缩进、String.transform()--转换方法
    • 新增了Files.mismatch()方法,用于文件对比。比较两个文件并查找其内容中第一个不匹配字节的位置,如果文件相同,则为-1L
    • 新增了Collectors.teeing()方法,它是两个下游收集器的组合,每个元素都由两个下游收集器处理。然后,它们的结果被传递给合并函数并转换为最终结果
    • 紧凑数字格式的CompactNumberFormat,用于格式化数字,例如:NumberFormat.getCompactNumberInstance(Locale.CHINA, CompactStyle.SHORT)
      @Test
      public void givenNumber_thenCompactValues() {
          NumberFormat likesShort =
          NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
          likesShort.setMaximumFractionDigits(2);
          assertEquals("2.59K", likesShort.format(2592));
      
          NumberFormat likesLong = 
            NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
          likesLong.setMaximumFractionDigits(2);
          assertEquals("2.59 thousand", likesLong.format(2592));
      }
      

# 13

2019年9月17日发布 (opens new window)。

Java 13继续改进模式匹配和文本处理能力。

  • JEP-350: 动态 CDS 归档。可以在应用程序退出时生成共享存档,这消除了试运行的需要。使用-XX:SharedArchiveFile参数
  • JEP-351: ZGC: 取消提交未使用存储器
  • JEP-353: 重新实现旧版 Socket API
  • JEP-354: Switch 表达式(预览阶段)。从12的直接返回,变成了使用yield返回
    public static String switchJava13(String month) {
        return switch (month) {
            case "march", "april", "may":
                yield "春天";
            case "june", "july", "august":
                yield "夏天";
            case "september", "october", "november":
                yield "秋天";
            case "december", "january", "february":
                yield "冬天";
            default:
                yield "month error";
        };
    }
    
  • JEP-355: 文本块(预览阶段)。String中也新增了三个方法:stripIndent--删除空白、translateEscapes--将转义序列(如“\t”转换为“\t”)、formatted--与String::format的工作方式相同,但用于文本块
    String TEXT_BLOCK_JSON = """
    {
        "name" : "Baeldung",
        "website" : "https://www.%s.com/"
    }
    """;
    
  • 支持Unicode 12.1

# 14

2020年3月17日发布 (opens new window)。

Java 14在模式匹配和记录类方面取得了重要进展。

  • JEP-305:使用 instanceof 的模式匹配(预览)
    public static void main(String[] args) {
        Object obj = "hello";
        if (obj instanceof String str) {
            System.out.println(str.toUpperCase());
        } else {
            System.out.println(obj);
        }
    }
    
  • JEP-343:打包工具(孵化中)
  • JEP-345:在 G1 中,对不均匀的内存访问(NUMA)情况下的内存申请优化
  • JEP-349:JFR Event Streaming
  • JEP-352:使字节缓冲区能够映射到非易失性存储器上
  • JEP-358:有帮助的 NullPointerExceptions,定位到变量
  • JEP-359:记录类(预览),关键字为record。例如:public record Person(String name, int age) {},效果和lombok的@Data类似
  • JEP-361:Switch 表达式(标准)。和12中的预览一直,去除了13中的yield关键字用法
  • JEP-362:弃用 Solaris 和 SPARC 平台上的移植版本
  • JEP-363:移除 Concurrent Mark Sweep (CMS) 垃圾收集器
  • JEP-364:适用于 macOS 的 ZGC
  • JEP-365:适用于 Windows 的 ZGC
  • JEP-366:弃用 ParallelScavenge + SerialOld 的垃圾收集器组合
  • JEP-367:移除 Pack200 相关的工具及 API
  • JEP-368:文本块(第二预览版本)。新增了两个转义符:1、\ 结尾不换行;2、\s 表示一个空格
  • JEP-370:外部内存访问 API (opens new window)(孵化中),基于MemorySegment、MemoryAddress 和 MemoryLayout三个类

# 15

2020年9月15日发布 (opens new window)。

Java 15引入了密封类和隐藏类等重要特性。

  • JEP 339:爱德华曲线数字签名算法 (EdDSA)
  • JEP 360:密封类(预览)有些时候我们可能想让某个类可以被某些类型继承,但是又不能随意继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。这样这个类就只能被指定的类继承。(sealed 、non-sealed、permits关键字)
  • JEP 371:隐藏类 (opens new window)。隐藏类不需要经过类加载器的完整加载和扫描过程,可以提供更好的性能,lambda表达式使用隐藏类来实现。
  • JEP 372:移除 Nashorn JavaScript 引擎
  • JEP 373:重新实现 DatagramSocket API
  • JEP 374:禁用并弃用偏向锁
  • JEP 375:使用 instanceof 的模式匹配(第二预览版本)
  • JEP 377:ZGC: 可伸缩的低延迟垃圾收集器。参考:亚毫秒GC暂停到底有多香?JDK17+ZGC初体验 (opens new window)
  • JEP 378:文本块 (opens new window)
  • JEP 379:Shenandoah: 低暂停时间的垃圾收集器
  • JEP 381:移除 Solaris 和 SPARC 平台上的移植版本
  • JEP 383:外部内存访问 API(第二孵化版本)
  • JEP 384:记录类(第二预览)
  • JEP 385:弃用 RMI Activation 以待后续移除

# 16

2021年3月16日发布 (opens new window)。

Java 16正式化了模式匹配和记录类,同时增强了平台支持。

  • JEP 338:Vector API(孵化)
  • JEP 347:启用 C++14 语言特性
  • JEP 357:从 Mercurial 迁移到 Git
  • JEP 369:迁移到 GitHub
  • JEP 376:ZGC: 并发的线程栈处理
  • JEP 380:用于 Unix 域套接字的 Channel
  • JEP 386:Alpine Linux 的移植版本
  • JEP 387:可伸缩的 Metaspace
  • JEP 388:Windows/AArch64 的移植版本
  • JEP 389:外部链接器 API(孵化)
  • JEP 390:对值类型的类(Value-based Classes)发出警告
  • JEP 392:打包工具
  • JEP 393:外部内存访问 API(第三孵化版本)
  • JEP 394:使用 instanceof 的模式匹配
  • JEP 395:记录类 (opens new window)
  • JEP 396:在缺省情况下对 JDK 内部进行强封装,也就是默认 –-illegal-access=deny
  • JEP 397:密封类(第二预览版本)
  • API变动
    • 新增Stream.toList()、Stream.toSet()方法
    • 代理类中支持调用default方法
        interface HelloWorld {
            default void hello() {
                return "hello";
            }
        }
      Object proxy = Proxy.newProxyInstance(getSystemClassLoader(), new Class<?>[] { HelloWorld.class },
        (prox, method, args) -> {
            if (method.isDefault()) {
                return InvocationHandler.invokeDefault(prox, method, args);
            }
            // ...
        }
      );
      Method method = proxy.getClass().getMethod("hello");
      assertThat(method.invoke(proxy)).isEqualTo("world");
      
    • DateTimeFormatter新增了时段符号“B”,可用于替换am/pm
      LocalTime date = LocalTime.parse("15:25:08.690791");
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h B");
      assertThat(date.format(formatter)).isEqualTo("3 in the afternoon");
      

# 17(LTS)

2021年9月14日发布 (opens new window)。

Java 17是继Java 11后的下一个LTS版本,带来了多项重要的安全性和性能改进。

# 核心特性

  • JEP 409:密封类 (opens new window)(正式版)。允许类指定其子类,增强类层次的控制力:

    public sealed class Shape permits Circle, Rectangle, Triangle {
        // ...
    }
    
    public final class Circle extends Shape {
        // ...
    }
    
  • JEP 356:增强的伪随机数生成器。提供更好的随机数生成算法和统一的API

  • JEP 403:对JDK内部API进行强封装。默认不允许访问sun.misc.Unsafe等内部API,提高安全性

# 其他重要特性

  • JEP 306:恢复严格浮点语义,提高数值计算的一致性
  • JEP 382:新的macOS渲染管线,支持Apple Silicon
  • JEP 391:macOS/AArch64架构支持(Apple M1芯片)
  • JEP 398:弃用Applet API,为未来移除做准备
  • JEP 406:switch模式匹配(预览),支持null值处理
  • JEP 407:移除RMI Activation功能
  • JEP 410:移除实验性的AOT和JIT编译器
  • JEP 411:弃用安全管理器,计划未来移除
  • JEP 412:外部函数与内存API(预览)——Project Panama的一部分
  • JEP 414:Vector API(第二预览)
  • JEP 415:限定上下文的反序列化过滤器,增强安全性

# 18

2022年3月22日发布 (opens new window)。

Java 18引入了简单的Web服务器和网络地址解析改进。

  • JEP 400:默认使用 UTF-8
  • JEP 408:简易 Web 服务器。使用 jwebserver 启动一个 Web 服务器,默认发布的是当前目录。
  • JEP 413:Java API 文档中的代码片段,使用@snippet标记
  • JEP 416:使用 Method Handle 重新实现核心反射
  • JEP 417:Vector API(第三孵化版本)
  • JEP 418:因特网地址解析 SPI
    InetAddress inetAddress = InetAddress.getByName("www.wdbyte.com");
    System.out.println(inetAddress.getHostAddress());
    // 输出
    // 106.14.229.49
    
  • JEP 419:外部函数与内存 API(第二预览版本)
  • JEP 420:使用 switch 的模式匹配(第二预览版本)。判断的时候支持复杂表达式:case Triangle t && (t.calculateArea() > 100);case的时候可以进行类型判断:case A a -> 1;
  • JEP 421:弃用Finalization,以待后续移除

# 19

2022年9月20日发布 (opens new window)。

Java 19在虚拟线程和结构化并发方面取得了重要进展。

  • JEP 405:Record 模式匹配(预览)。例如:if(dog1 instanceof Dog(String name,Integer age)){}
  • JEP 422:Linux/RISC-V 的移植版本
  • JEP 424:外部函数与内存 API(预览)
  • JEP 425:虚拟线程(预览),Executors.newVirtualThreadPerTaskExecutor()创建虚拟线程池
  • JEP 426:Vector API (opens new window)(第四预览版本)
  • JEP 427:使用 switch 的模式匹配(第三预览版本)
  • JEP 428:结构化并发 (opens new window)(孵化)

# 20

2023年3月21日发布 (opens new window)。

Java 20继续改进模式匹配和虚拟线程特性。

  • JEP 429:作用域值 (opens new window)(孵化)
  • JEP 432:记录类的模式匹配(第二预览版本)
  • JEP 433:使用 switch 的模式匹配(第四预览版本)。对判断部分进行了增强,case String s when s.length() > 2 -> "是个字符串,长度大于2";
  • JEP 434:外部函数与内存 API(第二预览版本)
  • JEP 436:虚拟线程(第二预览版本)
  • JEP 437:结构化并发(第二孵化版本)

# 21(LTS)

2023年9月19日发布 (opens new window)。

Java 21是继Java 17后的新LTS版本,引入了多项重要的语言特性和性能改进。

# 核心特性

  • JEP 444: 虚拟线程 (opens new window)(正式版)。这是最重要的特性,大幅改善高并发场景下的性能:

    // 创建虚拟线程
    Thread virtualThread = Thread.ofVirtual().start(() -> {
        System.out.println("运行在虚拟线程中");
    });
    
    // 使用虚拟线程执行器
    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
        executor.submit(() -> {
            // 你的任务代码
        });
    }
    
  • JEP 431: 顺序集合 (opens new window)。为List、Set和Map引入统一的顺序访问接口:

    // 新的接口方法
    list.getFirst();    // 替代 list.get(0)
    list.getLast();     // 替代 list.get(list.size()-1)
    list.addFirst(e);   // 在开头添加
    list.addLast(e);    // 在末尾添加
    list.removeFirst(); // 移除第一个
    list.removeLast();  // 移除最后一个
    list.reversed();    // 返回反向视图
    
  • JEP 440: 记录类的模式匹配(正式版)。提供更优雅的数据解构方式

  • JEP 441: switch的模式匹配(正式版):

    static String formatter(Object obj) {
        return switch (obj) {
            case Integer i -> String.format("int %d", i);
            case Long l    -> String.format("long %d", l);
            case Double d  -> String.format("double %f", d);
            case String s  -> String.format("String %s", s);
            default        -> obj.toString();
        };
    }
    

# 其他重要特性

  • JEP 430: 字符串模板(预览) (opens new window)。提供更安全的字符串插值方式:

    String name = "World";
    String message = STR."Hello, \{name}!"; // 字符串模板
    
  • JEP 439: 分代ZGC,进一步提升垃圾回收性能

  • JEP 443: 未命名的模式和变量(预览),简化不需要的变量声明:

    // 使用 _ 忽略不需要的变量
    if (obj instanceof Point(var x, _)) { 
        // 只关心 x 坐标
    }
    
  • JEP 445: 无名类和实例主方法(预览) (opens new window),简化初学者入门:

    // 简化的 main 方法
    void main() {
        System.out.println("Hello World!");
    }
    
  • JEP 446: 作用域值(预览),提供更好的线程局部存储替代方案

  • JEP 448: Vector API(第六个孵化器)。SIMD向量计算支持

  • JEP 452: 密钥封装机制API,增强加密功能

  • JEP 453: 结构化并发(预览),简化并发编程模型

  • JEP 442: 外部函数与内存API(第三预览)——Project Panama

# 平台支持变化

  • JEP 449: 弃用Windows 32位x86支持
  • JEP 451: 准备禁止动态加载代理,增强安全性

# 22

2024年3月19日发布 (opens new window)。

Java 22正式化了外部函数与内存API,同时引入了多项预览特性。

  • JEP 423: G1的区域固定。通过在 G1 中实现区域固定来减少延迟,以便在 Java 本机接口 (JNI) 关键区域期间无需禁用垃圾收集。
  • JEP 447: 在super(...)之前的语句(预览)。允许构造函数中在super()之前进行条件验证等语句的存在
  • JEP 454: 外部函数与内存API (opens new window)
  • JEP 456: 未命名的模式和变量 (opens new window)
  • JEP 457: Class-File API(预览) (opens new window)
  • JEP 458: 启动多文件源代码程序
  • JEP 459: 字符串模板(第二次预览)
  • JEP 460: 矢量API(第七个孵化器)
  • JEP 461: 流收集器(预览) (opens new window)
  • JEP 462: 结构化并发(第二次预览)
  • JEP 463: 隐式声明的类和实例主方法(第二次预览)
  • JEP 464: 作用域值(第二次预览)

# 23

2024年9月17日发布 (opens new window)。

  • JEP 455: 支持instanceof和switch中的原始类型(预览)。现在可以这样写:if(i instanceof byte b),或者switch(i){ case int i -> ... ;}
  • JEP 466: Class-File API(第二次预览)
  • JEP 467: 支持Markdown文档注释。允许在Javadoc注释中使用Markdown语法,让文档编写更加友好
  • JEP 469: Vector API(第八个孵化器)
  • JEP 473: Stream收集器(第二次预览)
  • JEP 471: 弃用sun.misc.Unsafe中的内存访问方法以供移除
  • JEP 474: ZGC默认开启分代模式。分代ZGC成为默认选项,进一步提升垃圾回收性能
  • JEP 476: 模块导入声明(预览)。可以直接导入整个模块:import module java.base,这样会导入模块下的所有导出包
  • JEP 477: 隐式声明的类和实例主方法(第三次预览)
  • JEP 480: 结构化并发(第三次预览)
  • JEP 481: 作用域值(第三次预览)
  • JEP 482: 灵活的构造函数体(第二次预览)。允许在super()调用之前执行验证代码

# 24

2025年3月18日发布 (opens new window)。

Java 24是一个短期支持版本,包含24个新JEP特性,在量子计算抵抗、性能优化和平台支持方面有重要突破。

# 重要正式特性

  • JEP 484: Class-File API(正式版)。提供程序化方式来解析、生成和转换Java类文件

  • JEP 485: Stream Gatherers(正式版)。增强Stream API的中间操作能力:

    // 使用Gatherers进行复杂的流处理
    List<String> result = Stream.of("a", "bb", "ccc")
        .gather(Gatherers.windowFixed(2))
        .map(window -> String.join("-", window))
        .toList();
    
  • JEP 486: 永久禁用安全管理器。正式移除安全管理器,提高性能和简化架构

# 量子计算抵抗

  • JEP 496: 量子抵抗模块格简密钥封装机制。为未来的量子计算威胁做准备
  • JEP 497: 量子抵抗模块格简数字签名算法。提供量子安全的数字签名功能

# 性能优化

  • JEP 404: 分代Shenandoah(实验性)。提供更低延迟的垃圾收集
  • JEP 450: 紧凑对象头(实验性)。减少对象头开销,节省内存
  • JEP 475: G1的后期屏障扩展。优化G1垃圾收集器的写屏障性能
  • JEP 483: 预先类加载和链接。改善应用启动时间
  • JEP 491: 虚拟线程同步不钉住。解决虚拟线程的钉住问题

# ZGC改进

  • JEP 490: ZGC移除非分代模式。简化ZGC实现,只保留分代模式

# 平台支持变化

  • JEP 479: 移除Windows 32位x86端口。正式停止支持32位Windows系统
  • JEP 501: 弃用x86-32端口以供移除。为未来移除做准备

# 安全性增强

  • JEP 472: 准备限制JNI的使用。增强平台安全性
  • JEP 478: 密钥派生函数API(预览)。提供标准化的密钥派生功能
  • JEP 498: 警告sun.misc.Unsafe内存访问方法的使用

# 继续预览的特性

  • JEP 487: 作用域值(第四次预览)
  • JEP 488: 原始类型模式匹配(第二次预览)
  • JEP 492: 灵活的构造函数体(第三次预览)
  • JEP 494: 模块导入声明(第二次预览)
  • JEP 495: 简单源文件和实例主方法(第四次预览)
  • JEP 499: 结构化并发(第四次预览)

# 其他特性

  • JEP 489: Vector API(第九个孵化器)
  • JEP 493: 不使用JMOD链接运行时镜像。简化部署流程

注意:Java 24不是LTS版本,仅提供6个月的支持。下一个LTS版本将是Java 25,预计在2025年9月发布。

# 其他

  • Oracle JDK 和 OpenJDK 之间的差异 (opens new window)
  • OpenJDK 生命周期和支持政策 (opens new window)

祝你变得更强!

编辑 (opens new window)
#Java版本新特性
上次更新: 2025/08/16
Java数据库连接(JDBC)
写好Java Doc

← Java数据库连接(JDBC) 写好Java Doc→

最近更新
01
AI时代的编程心得
09-11
02
Claude Code与Codex的协同工作
09-01
03
Claude Code实战之供应商切换工具
08-18
更多文章>
Theme by Vdoing | Copyright © 2018-2025 京ICP备2021021832号-2 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式