从 Java 8 以后,每个版本发布都增加了哪些新特性呢?我们一起来看一下。
Java各版本新特性.png

Java9

  • 私有接口方法
  • 默认垃圾收集器改为 G1
  • HTTP client,支持 WebSocket、HTTP/2、HTTPS/TLS、非阻塞 API

    Java10

  • 局部变量类型推断,可以使用 var 类型来定义变量。

  • 不可变集合
  • G1 支持并行 Full GC
  • 基于 Java 的 JIT 编译器 Graal
  • 支持在不执行全局安全点的情况下执行线程回调,这样可以在不停止所有线程的情况下停止单个线程。

    Java11

  • 标准 HTTP Client 升级

  • 引入 ZGC 垃圾收集器
  • Flight Recorder,可以收集基于 OS、JVM和JDK 事件产生的数据。
  • 对Stream、Optional、集合 API进行增强。

    Java12

  • 引入 Switch 表达式

  • Shenandoah GC 垃圾收集算法
  • JMH 基准测试
  • G1 支持可中断的 mixed GC,将 Mixed GC 拆分为强制部分和可选部分,强制部分一定会被回收,可选部分可以不被回收,这样垃圾收集过程中优先处理强制集,更容易满足暂停时间目标.
  • G1 可以归还不使用的内存给操作系统

    Java13

  • switch 优化更新,增加 yield 关键字用于返回结果。

  • ZGC 支持将未使用的内存归还操作系统
  • 引入了文本块,可以使用 “”” 三个引号表示文本块,示例代码如下:

    1. String html = """
    2. Hello, world
    3. """;

    Java14

  • instanceof 语法简化,可以直接给对象赋值:

    1. if (obj instanceof String s) {
    2. //这里可以使用 s 变量
    3. } else {
    4. //这里不能使用 s 变量
    5. }
  • 引入 Record,类似于枚举类型,具有 Lombok 功能,可以自动生成构造器、equals、getter 等方法。

  • 放弃 CMS

    Java15

  • 引入 hidden class

  • String.substring 优化,如果长度为 0,返回 null
  • 引入 Sealed class

    Java16

  • Stream新增toList方法

  • 提供jpackage
  • java.time 根据时段获取时间

    Java17

  • 升级 switch 使用,switch可直接用 instanceof 模式匹配选择,不过需要提前做 null 判断(下面代码选自 oschina):

    1. Object o;
    2. switch (o) {
    3. case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");
    4. case String s -> System.out.println("判断是否为字符串,s:" + s);
    5. case record p -> System.out.println("判断是否为Record类型: " + p.toString());
    6. case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + ia.length);
    7. case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);
    8. case Student s -> System.out.println("判断是否为具体学生对象,student:" + s.toString());
    9. case UserCommonService -> System.out.println("判断是否为普通用户实现类,然后走普通用户逻辑");
    10. case UserVipService -> System.out.println("判断是否为vip用户实现类,然后走vip用户逻辑");
    11. default -> System.out.println("Something else");
    12. }
  • 默认启用 Parallel GC

  • 增强TreeMap
  • 统一日志异步刷新,先将日志写入缓存,独立线程负责刷新到相应输出。

上面的版本只有 Java 11 和 Java 17 是 LTS(Long Term Support) 版本。总结全面拥抱 Java 17 还没有真的到来,但已经在路上了,作为程序员的我们应该做准备了。

Java18

  • UTF-8作为默认编码
    不指定编码的情况下,默认都使用UTF-8
  • 简单的网络服务器
    提供了一个新命令 jwebserver,运行这个命令可以启动一个简单的 、最小化的静态Web 服务器,它不支持 CGI 和 Servlet,所以最好的使用场景是用来测试、教育、演示等需求。
  • Java API文档中的代码片段
    @snippet在注释中可添加代码片段 {@snippet….}
  • 使用方法句柄重新实现核心反射
    优化了反射的效率