一文详解|从 JDK8 飞升到 JDK17,再到未来的 JDK21

这篇具有很好参考价值的文章主要介绍了一文详解|从 JDK8 飞升到 JDK17,再到未来的 JDK21。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🌍 Java Development Kit (JDK) 特性一览


🔍 JDK 8


  • 🚀 Lambda 表达式和函数式接口

    • 定义:允许将函数作为一个方法的参数(函数作为参数)或将代码作为数据(函数作为值)。
    • 示例(a, b) -> a + b
  • 🔖 类型注解

    • 定义:提供了在任何使用类型的地方添加注解的能力。
    • 示例@NonNull String name;
  • 📅 新的日期/时间 API

    • 定义:全新的API,用于日期和时间的操作,替代旧的DateCalendar
    • 示例LocalDate.now();
  • 🔄 默认方法和静态方法

    • 定义:允许在接口中定义有具体实现的方法,不破坏与旧版本的兼容性。
    • 示例default void show() { System.out.println("Default Method"); }
  • 💧 Stream API

    • 定义:新的抽象,允许以函数式方式处理数据序列。
    • 示例list.stream().filter(x -> x > 5).collect(Collectors.toList());
  • 🖥 Nashorn JavaScript 引擎

    • 定义:一个新的JavaScript引擎,用于在Java应用程序中执行JavaScript代码。
    • 示例ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
  • 🛠 类加载器改进

    • 定义:对类加载器进行的一系列改进,提高其性能和灵活性。
    • 示例:使用ClassLoader的新方法和改进。
  • 🔢 并行数组操作

    • 定义:提供并行处理数组的能力,利用多核处理器的优势。
    • 示例Arrays.parallelSort(myArray);
  • 🧵 改进的线程局部变量

    • 定义:对ThreadLocal类的增强,以更高效地存储线程特定的数据。
    • 示例ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
  • 📦 Optional 类型

    • 定义:一个可以包含或不包含值的容器对象,可以有效地表示“值或无值”并避免null。
    • 示例Optional<String> optional = Optional.of("test");

🔍 JDK 9


  • 🧩 Jigsaw 模块化系统 (JPMS)

    • 定义:为Java引入的模块系统,允许将应用程序或库划分为不同的模块。
    • 示例module com.myapp { requires java.base; }
  • 💎 钻石操作符的适用范围扩展

    • 定义:允许在匿名内部类中使用钻石操作符,使代码更简洁。
    • 示例Handler<String> handler = new Handler<>() { /*...*/ };
  • 🔒 接口私有方法

    • 定义:在接口中定义私有方法,帮助组织方法实现,而不暴露给外部。
    • 示例interface MyInterface { private void myPrivateMethod() { /*...*/ } }
  • 🛠 改进的 try-with-resources 语句

    • 定义:允许在try-with-resources语句中引用在外部声明的final或effectively final变量。
    • 示例
      final Resource resource = new Resource();
      try (resource) { /*...*/ }
    
  • 📦 改进的 Optional 类型

    • 定义:为Optional添加了新的有用的方法。
    • 示例optional.orElseThrow();
  • 💧 改进的 Stream API

    • 定义:为Stream添加了新的方法和特性。
    • 示例list.stream().takeWhile(x -> x < 5).collect(Collectors.toList());
  • 🧰 集合工厂方法

    • 定义:简洁的方法创建不可变集合。
    • 示例List<String> list = List.of("A", "B", "C");
  • 🌊 Flow API

    • 定义:定义了发布-订阅框架的标准。
    • 示例:使用Flow.Publisher, Flow.Subscriber等进行响应式编程。
  • 📖 改进的 Javadoc

    • 定义:Javadoc工具的改进,包括更好的HTML5支持和搜索功能。
    • 示例:生成的Javadoc页面中的搜索框。
  • 🖥 改进的 Process API

    • 定义:改进的API,用于管理和控制操作系统进程。
    • 示例ProcessHandle.current().pid();
  • 🌐 改进的 HTTP/2 客户端

    • 定义:引入了新的HTTP/2客户端API,替代HttpURLConnection
    • 示例:使用HttpClient, HttpRequest, HttpResponse进行HTTP请求。

🔍 JDK 10


  • 🕵️ 局部变量类型推断

    • 定义:允许Java编译器推断局部变量的类型,使代码更简洁。
    • 示例var list = new ArrayList<String>();
  • ♻️ 并行全垃圾回收器

    • 定义:并行GC的改进,使其能够在Full GC阶段并行处理。
    • 示例:在JVM启动参数中使用-XX:+UseParallelGC
  • 📊 应用类数据共享

    • 定义:允许应用程序之间共享类元数据,以减少启动时间和JVM内存使用。
    • 示例:在JVM启动参数中使用-XX:+UseAppCDS
  • 📅 基于时间的版本控制

    • 定义:新的版本命名策略,基于时间而不是任意命名。
    • 示例:使用如10.2018.04这样的版本号。

🔍 JDK 11


  • 🌐 HTTP/2 客户端增强

    • 定义:HTTP/2的正式客户端,代替JDK 9中的试验版本。
    • 示例:使用HttpClient, HttpRequest, 和HttpResponse进行HTTP/2请求。
  • 🧪 单元测试框架 JUnit 5

    • 定义:新的单元测试框架,提供了许多新特性和改进。
    • 示例@TestAssertions.assertEquals(expected, actual);
  • ♻️ ZGC 垃圾回收器

    • 定义:一个可扩展的低延迟垃圾回收器。
    • 示例:在JVM启动参数中使用-XX:+UseZGC
  • 🚀 改进的启动器

    • 定义:允许直接运行源代码文件,无需先编译。
    • 示例:运行java MyFile.java直接执行Java源代码。
  • 🌐 Unicode 10.0 支持

    • 定义:支持最新的Unicode标准,增加了新的字符集。
  • 🔒 原生 TLS 1.3 支持

    • 定义:增加了对最新的安全传输层协议的支持。
  • ♻️ 改进的 Epsilon 垃圾回收器

    • 定义:一个不做任何内存回收的垃圾回收器,主要用于性能测试。
    • 示例:在JVM启动参数中使用-XX:+UseEpsilonGC

🔍 JDK 12


  • ♻️ Shenandoah 垃圾回收器

    • 定义:一个低延迟的并发垃圾回收器。
    • 示例:在JVM启动参数中使用-XX:+UseShenandoahGC
  • 📁 默认 CDS 归档

    • 定义:提高启动速度通过默认的类数据共享归档。
    • 示例:使用JVM参数-Xshare:auto
  • 🔄 增强的 Switch 语句

    • 定义:为Switch语句添加多值情况和其他增强功能。
    • 示例switch (day) { case MONDAY, TUESDAY -> System.out.println("Early week"); }
  • ♻️ 改进的 G1 清理阶段

    • 定义:优化G1垃圾回收器的清理阶段,提高性能。
  • 🖥 改进的 AArch64 处理器支持

    • 定义:增强了对AArch64架构的支持和优化。

🔍 JDK 13


  • 🔄 改进的 Switch 表达式

    • 定义:Switch表达式的进一步改进,提供更简洁的语法。
    • 示例int num = switch (day) { case MONDAY -> 1; case TUESDAY -> 2; };
  • 📜 Text Blocks

    • 定义:允许多行字符串,使字符串字面值更加简洁。
    • 示例
      String text = """
        Line 1
        Line 2
        Line 3
      """;
    
  • ♻️ ZGC 调整策略

    • 定义:ZGC的优化和调整,以更好地应对不同的工作负载。
  • 🖨 通过 JVM 选项打印垃圾回收事件

    • 定义:更详细的垃圾回收日志选项,帮助调试和性能分析。
  • ♻️ ZGC 和 Shenandoah 增加副本数

    • 定义:这两种垃圾回收器的改进,以提高效率和吞吐量。

🔍 JDK 14


  • 🔄 Switch 表达式增强

    • 定义:进一步的Switch表达式增强,使其更加功能强大和灵活。
  • 🕵️ 简化的局部变量类型推断

    • 定义:进一步简化了局部变量的类型推断,使代码更加简洁。
  • 特定的 NullPointerException 堆栈跟踪

    • 定义:当发生NullPointerException时,提供更详细的信息来确定问题的来源。
  • 🧐 Pattern Matching for instanceof

    • 定义:简化了instanceof操作的类型检查和类型转换。
    • 示例if (obj instanceof String s) { System.out.println(s.length()); }
  • 🧮 双倍精度浮点数和整数算术操作 API

    • 定义:新增的API,支持大数字的浮点和整数运算。
    • 示例:使用Math.multiplyExact, Math.addExact等方法。

🔍 JDK 15


  • ♻️ 全局垃圾收集器

    • 定义:一个实验性的垃圾收集器,旨在为所有内存分配提供低延迟。
  • ♻️ 改进的 G1 垃圾回收器

    • 定义:对G1垃圾回收器的继续改进,提高其性能和效率。
  • 🔖 简化的元注解语法

    • 定义:提供了一种简化的方式来指定注解的目标类型。
    • 示例@Target(TYPE_USE) @interface NonNull {}
  • 📜 Records 类型(预览功能)

    • 定义:为简单的数据传输对象提供一个简洁的语法。
    • 示例record Point(int x, int y) {}
  • ♻️ 改进的 ZGC

    • 定义:对ZGC垃圾收集器的进一步优化和改进。

🔍 JDK 16


  • 🖨 更好的垃圾回收日志信息

    • 定义:增强了垃圾回收日志的详细度和可读性。
  • 🛠 改进的 Vector API

    • 定义:为SIMD硬件指令提供了Java API,允许更高效的并行计算。
    • 示例:使用Vector类进行并行操作。
  • 🖥 操作系统信息访问 API

    • 定义:提供API来查询和访问操作系统的详细信息。
    • 示例:使用OperatingSystemMXBean
  • 🛠 优化的方法/调用 API

    • 定义:改进的方法调用API,提供更高的性能和灵活性。
  • 🔒 改进的 AES 密码算法实现

    • 定义:提供了更高效的AES加密和解密实现。

🔍 JDK 17


  • 🖋 嵌套的代码块作用域

    • 定义:允许在单个方法或代码块中定义多个嵌套的作用域。
    • 示例
      {
          int x = 10;
          {
              int y = 5;
              System.out.println(x + y);
          }
      }
    
  • ♻️ 自定义的垃圾回收器策略

    • 定义:允许开发者使用自定义的垃圾回收策略。
  • 🖥 支持 C++ 14 语言特性

    • 定义:JVM的内部代码现在可以使用C++ 14的语言特性。
  • 📎 改进的弱引用

    • 定义:对WeakReference类的改进,使其更加高效。
  • ♻️ 改进的 ZGC 和 Shenandoah 垃圾回收器

    • 定义:对这两个垃圾回收器的进一步优化和改进。

🔍 JDK 18


  • ♻️ 增强的垃圾回收器接口

    • 定义:提供了更加灵活和强大的垃圾回收器接口。
  • 🧵 支持 Loom 协程的 JVM 机制

    • 定义:为Java引入的协程支持,提供轻量级的并发模型。
    • 示例:使用FiberFiberScope进行协程编程。
  • ♻️ ZGC 和 Shenandoah 垃圾回收器进一步改进

    • 定义:对这两个垃圾回收器的进一步优化。
  • 🧵 底层 JVM 线程池的重新设计文章来源地址https://www.toymoban.com/news/detail-796283.html

    • 定义:对JVM内部线程池的架构进行的重大改进。

到了这里,关于一文详解|从 JDK8 飞升到 JDK17,再到未来的 JDK21的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mac卸载jdk8,安装jdk17

    本次操作基于MacBook 因为工作需要,需要将jdk版本由jdk8升级到jdk17,同一台机器上是可以同时安装多个版本的jdk的,但是为了避免一些冲突和未知问题,这里直接卸载旧版本jdk,然后再重新安装新版本。 先查看本机安装的jdk: 删除java运行环境: 到java的目录,用ls命令查看机

    2024年02月08日
    浏览(66)
  • JDK8-JDK17版本升级

    记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类,但代码少得多;大多数开发人员使用 Lombok 生成 POJO 类,但是有了记录,你就不需要使用任何第三方库。 sealed将类的继承限制为一组有限的子类 密封类的子类可以声明为fina

    2024年01月17日
    浏览(45)
  • JDK8和JDK17安装切换,IDEA配置多个版本JDK

    JAVA之父高斯林推荐我们用JDK17,请尽快离开JDK8。JDK17 LTS在每个维度上都是一个巨大的飞跃: 在Java 17正式发布之前,Java开发框架Spring率先在官博宣布,Spring Framework 6和Spring Boot 3计划在2022年第四季度实现总体可用性的高端基线: Java 17+(来自 Spring Framework 5.3.x 线中的 Java 8-17)

    2023年04月27日
    浏览(64)
  • JDK8升级JDK17过程中遇到的那些坑

    JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。 下载JDK17的最新版本 jdk-17_linux-x64_bin.tar.gz ,解压缩后移动到 /usr/lib

    2024年02月11日
    浏览(42)
  • java jdk8和jdk17同时存在【环境配置】

    jdk8:https://www.oracle.com/cn/java/technologies/javase/javase8u211-later-archive-downloads.html jdk17:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html PS:jdk8在下载结束,安装的时候,需要有两个文件分别是jre和jdk JRE: 是Java Runtime Environment,是java程序的运行环境。既然是运行,当然要包含

    2024年02月07日
    浏览(65)
  • JDK8到JDK17有哪些吸引人的新特性?

    作者:京东零售 刘一达 2006年之后SUN公司决定将JDK进行开源,从此成立了OpenJDK组织进行JDK代码管理。任何人都可以获取该源码,并通过源码构建一个发行版发布到网络上。但是需要一个组织审核来确保构建的发行版是有效的, 这个组织就是JCP(Java Community Process)。2009年,SUN公

    2023年04月18日
    浏览(50)
  • 一次项目漏洞升级的过程(JDK8升级到JDK17)

    准备工作: 第一步、漏洞扫描工具trivy; 第二步、扫描后的漏洞存在镜像漏洞,中间件漏洞和代码jar包漏洞; 第三步、区分对外和不对外的服务,先更新对外服务; 第四步、找出一个对外服务需要升级的jar 1、spring-web需要升级到6.x,spring-boot需要升级到3.x,JDK需要升级到J

    2024年01月20日
    浏览(48)
  • 如何在MAC M1上同时安装JDK8和JDK17

    笔者原先就在电脑上安装了JDK8,由于需要用到MAT,MAT支持MAC m1的只兼容JDK17及以上的版本,故需安装JDK17,特此记录。 首先,从oracle官网下载JDK17:https://www.oracle.com/java/technologies/downloads/#java17 JDK默认安装在/Library/Java目录下,打开访达,通过shift+command+g直达文件,如果安装成

    2024年02月15日
    浏览(45)
  • 【JDK】二、环境变量从jdk17切换为jdk8后不生效的解决办法

    在学习springboot3时配置了java17的环境变量,但平常工作中使用的还是java8,所以还需要再还原配置。 单还原环境变量配置后,使用 java -version 还是17的问题。 重启后输入java-version 命令 任然 是java17,显然是不对的 是因为我们在安装了jdk17后,默认添加的17的环境变量配置,并且

    2024年02月07日
    浏览(43)
  • 关于老项目从JDK8升级到JDK17所需要注意的细节

    这个是最简单的网上很多教程我这边就不在重复了 🌸1.第一种方式 🌸1.1.修改Idea中的JDK版本 跟步骤修改 修改Java Compiler 🌸1.2.关于修改过程中遇到的异常 如果出现下面异常按照上述步骤定可以解决 🌸1.3.IDEA工具栏操作Maven正常,但使用mvn命令运行就报错 使用侧工具栏的打包

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包