Java - JDK演变之路和JDK21新特性

news2024/12/24 8:59:52

Java - JDK演变之路和JDK21新特性

  • 前言
  • 一. JDK演变之路
    • JDK9 新特性(2017年9月)
    • JDK10 新特性(2018年3月)
    • JDK11 新特性(2018年9月 - LTS版本)☆
    • JDK12 新特性(2019年3月)
    • JDK13 新特性(2019年9月)
    • JDK14 新特性(2020年3月)
    • JDK15 新特性(2020年9月)
    • JDK16 新特性(2021年3月)
    • JDK17 新特性(2021年9月 - LTS版本)☆
  • 二. JDK21 新特性
    • String Templates(字符串模板)☆
    • Record Patterns(记录模式)
    • Pattern Matching for switch ☆
    • Generational ZGC
    • 虚拟线程 ☆☆

前言

2023年9月19日,Oracle 正式推出了 JDK21 ,并且将为JDK21提供至少八年的支持。JDK21Java 平台的12个功能版本之一,该版本包含了数千项性能、稳定性和安全更新,以及 15 项重大的新特性和增强。在介绍 JDK21之前,我们先看下JDK的演变之路。

一. JDK演变之路

JDK8是我们经常用的版本号,这里就不说了。我们从JDK9开始。只说几个重点的特性。

JDK9 新特性(2017年9月)

  • 提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法。
  • 模块系统。
  • 设置G1JVM默认垃圾收集器。
  • 支持 http2.0websocketAPI

JDK10 新特性(2018年3月)

  • 可以通过 var 关键字实现局部变量的类型推断。
  • JVMG1 垃圾收集器由单线程改成多线程。

JDK11 新特性(2018年9月 - LTS版本)☆

LTS版本:Long Term Support,也就是官方保证会长期支持的版本。

  • 新增ZGC垃圾收集器。
  • Stream、集合相关的API进行增强。

JDK12 新特性(2019年3月)

  • Switch 表达式扩展,可以有返回值。
  • G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC效率。
  • 新增NumberFormat对复杂数字的格式化
  • 字符串支持transform、indent操作

switch语法可以使用箭头语法,并且可以有返回值。

int size = 3;
String cn = switch (size) {
    case 1 -> "111";
    case 2 -> "222";
    case 3, 4 -> "333";
    default -> "000";
};
System.out.println(cn);

JDK13 新特性(2019年9月)

  • 文本块的引入:使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符。
  • ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统。
  • socket底层实现引入NIO

文本块的案例:

// 改进前
String json = "{\"name\":\"LJJ\",\"age\":\"123\"}"
// 改进后
String json = """ 
{     
    "name" : "LJJ",     
    "age" : "123" 
} 
""";

JDK14 新特性(2020年3月)

  • instanceof模式匹配,instanceof类型匹配语法简化,可以直接给对象赋值。
  • 引入Record类型,用于标记不可变的数据类型,类似于Lombok@Data注解。可以自动生成构造和get/set函数。
  • 删除 CMS 垃圾回收器。

instanceof匹配案例:

// 老写法
Object obj = "你好";
if (obj instanceof String) {
    String str = (String) obj;
    System.out.println(str);
}
// 新写法
Object obj = "你好";
if (obj instanceof String str) {
    // 此时的str不再是 Object 类型,而是 String 类型
    System.out.println(str);
}

Record使用案例:

// 老写法
public class User {
    private String name = null;
    private String password = null;public User(String name, String password) {
        this.name = name;
        this.password = password;
    }public String getName() {
        return name;
    }
​
​
    public String getPassword() {
        return password;
    }@Override
    public boolean equals(Object o) {
        //用于判断是否相等
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return name.equals(user.name) && password.equals(user.password);
    }@Override
    public int hashCode() {
        //hash算法
        return Objects.hash(name, password);
    }@Override
    public String toString() {
        return "user{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
// 新写法
public record User1(String name, String password) {}

JDK15 新特性(2020年9月)

  • Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用。

JDK16 新特性(2021年3月)

  • Pattern匹配:引入了Pattern匹配特性,使得对对象的模式匹配更加简洁和灵活。(也就是instanceof模式匹配过程中直接给你转型好了)
  • JDK14JDK15的一些特性进行正式引入(instanceof模式匹配和Record类)。

JDK17 新特性(2021年9月 - LTS版本)☆

  • 移除实验性的 AOTJIT 编译器。
  • 恢复始终执行严格模式 (Always-Strict) 的浮点定义。
  • 统一日志异步刷新,先将日志写入缓存,然后再异步刷新。
  • Spring6SpringBoot3需要JDK17,算是开源框架对JDK版本升级的一个推动。
  • 主要也是对前几个版本的功能整合以及完善。

二. JDK21 新特性

这里介绍几个重要的特性:

String Templates(字符串模板)☆

官网案例。在Java当中,往往对于字符串模板,我们都是采取以下几种方式来拼接:

  • +号拼接。
  • StringBuilder 拼接。
  • String.format 拼接。
  • 等等
int x = 10, y = 20;
System.out.println(x + " + " + y + " = " + (x + y));
System.out.println(new StringBuilder().append(x).append(" + ").append(y).append(" = ").append(x + y));
System.out.println(String.format("%1$d + %2$d = %3$d", x, y, x + y));
System.out.println(new MessageFormat("").format("{0} + {1} = {2}", x, y, x + y));

但是有了字符串模板之后,我们就可以更加方便的进行字符串的拼接,例如:

System.out.println(STR. "\{ x } + \{ y } = \{ x + y }" );

有几个特点:

  1. STR为开头标识。在这里插入图片描述

  2. 每个变量前面需要加 \ 转义。

其他用法例如:

@Test
public void testStringTemplates() {
    int index = 0;
    String data = STR. "\{ index++ }, \{ index++ }, \{ index++ }, \{ index++ }" ;
    System.out.println(data);
    System.out.println(STR. "The time is \{
            // The java.time.format package is very useful
            DateTimeFormatter
                    .ofPattern("HH:mm:ss")
                    .format(LocalTime.now())
            } right now" );
    //
    String title = "My Web Page";
    String text  = "Hello, world";
    String html = STR."""
    <html>
      <head>
        <title>\{title}</title>
      </head>
      <body>
        <p>\{text}</p>
      </body>
    </html>
    """;
    System.out.println(html);
}

结果如下:
在这里插入图片描述

Record Patterns(记录模式)

官网案例。允许开发人员使用模式来解构记录类的实例,从而简化数据查询。例如:

@Test
public void testRecordPatterns() {
    Test21ApplicationTests.printSum16(new Point(1, 2));
    Test21ApplicationTests.printSum21(new Point(1, 2));
}

record Point(int x, int y) {
}

static void printSum16(Object obj) {
    if (obj instanceof Point p) {
        int x = p.x();
        int y = p.y();
        System.out.println(x + y);
    }
}

static void printSum21(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x + y);
    }
}

两种方式都打印:3。

Pattern Matching for switch ☆

官网案例

static String formatter(Object obj) {
    String formatted = "unknown";
    if (obj instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (obj instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (obj instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (obj instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}

@Test
public void testSwitch() {
    System.out.println(Test21ApplicationTests.formatter("3"));
    System.out.println(Test21ApplicationTests.formatter(1));
}

结果如下:
在这里插入图片描述

Generational ZGC

官网案例。通过扩展 Z 垃圾收集器(ZGC),为新旧对象分别保留不同的世代,从而提高应用程序的性能。这将允许 ZGC 更频繁地收集年轻代的对象。

虚拟线程 ☆☆

官网案例。可以参考:JDK19 - Virtual Thread 虚拟线程探究

剩余的一些特性可以参考 官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《低代码指南》——我想将维格云与别的系统打通,自动同步数据,怎么实现?

与其他系统打通的3种形式 ​ 人工复制粘贴:操作难度低,时效性差,适合于少量数据定时更新Excel导入:可追加导入,作难度低,时效性差,适和于定期更新数据API对接:可实现实时数据对接,有一定操作门槛API对接的3种方法​ 维格机器人:可以通过维格机器人直接调用对接系统的…

MES与AGV对接浅谈

昨天分享一些有关数字工厂与立体库的对接经验&#xff0c;随着智能物料技术的越来越成熟&#xff0c;硬件设施成本的下降&#xff0c;很多制造业在工厂规划时已经开始考虑在物料搬运、物料配送等使用无人化的智能搬运机器。今天聊聊有关在智能工厂实施中MES与AGV的对接方式一些…

VM搭建虚拟机(CentOS镜像)

文章目录 VMware下载安装CentOS往下滑&#xff0c;找到alternative downloads向下滑找到Archived Versions进入isos目录点击x86/64选择镜像文件 下载很慢emo然后百度网盘直接下载就好 搭建虚拟机选择cenos下载目录&#xff0c;并选择稍后安装选择Linux&#xff0c;找到cenos7版…

跨域解决方案有哪些?

跨域 因为浏览器出于安全考虑&#xff0c;有同源策略。也就是说&#xff0c;如果协议、域名或者端口有一个不同就是跨域&#xff0c;Ajax 请求会失败。 我们可以通过以下几种常用方法解决跨域的问题 JSONP JSONP 的原理很简单&#xff0c;就是利用 <script> 标签没有…

基于轻量级yolov5n开发构建涵洞场景下洞体墙体缺陷病害检测分割系统

在前文&#xff1a; 《AI助力隧道等洞体类场景下水泥基建缺陷检测&#xff0c;基于DeeplabV3Plus开发构建洞体场景下壁体建筑缺陷分割系统》 我们基于DeepLabv3Plus尝试构建了洞体类建筑缺损病害问题分割系统&#xff0c;本文的核心思想是想要基于yolo这一经典的模型来开发构…

VIRTIO-Virtual IO Based On VPP/DPDK at front

简介 虚拟化技术是云计算的基石&#xff0c;是构建上层弹性计算、弹性存储、弹性网络的基本成份。所谓虚拟化&#xff0c;即对计算所需的资源进行模拟&#xff0c;提供与物理资源一般无二的特性和运行环境。如Qemu将整个VM所需环境进行虚拟化&#xff1a;一个Qemu进程代表一台…

【Vue】初步认识<script setup>语法糖和组合式 API

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ &#x1f6eb; 导读 需求 最近写代码的时候&#xff0c;发现<script setup>这样的代码&#xff0c;没见过&#xff0c;好奇&#xff0c;想知道。 所以就有了这篇文章。 很多文章都说setup是vue3的特权。但是&#xff…

2023.10.29 关于 HashTable 和 ConcurrentHashMap 区别

目录 HashTable ConcurrentHashMap 优化点一 优化点二 优化点三 优化点四 不关键的小区别 HashTable HashMap 和 HashTable 都是常见的哈希表数据结构&#xff0c;用于存储键值对 注意&#xff1a; HashMap 是线程不安全的HashTable 是线程安全的&#xff0c;其关键方法…

MapBox获取点位高程的三种方式

以下提供了三种方法和思路 1&#xff0c;通过mapbox全球dem数据获取高程 这里我们利用了mapbox的tilequery 官网地址在这里 https://docs.mapbox.com/api/maps/tilequery/ 以下是示例代码&#xff0c;这个方式是简单快捷&#xff0c;缺点就是精度不高&#xff0c;大概是以10m…

世界前沿技术发展报告2023《世界航空技术发展报告》(五)直升机技术

&#xff08;五&#xff09;直升机技术 1.常规直升机技术1.1 北约六国联合启动下一代旋翼飞行器能力项目1.2 美国和法国重视发展有人/无人直升机编组能力1.3 美国“黑鹰”直升机完成不载人全自主飞行 2.新概念直升机技术2.1 美国“劫掠者”X型直升机参与陆军“未来攻击侦察机”…

【电路笔记】-交流电感和感抗

交流电感和感抗 文章目录 交流电感和感抗1、概述1.1 电感1.2 电感器 2、频率特性2.1 电抗(Reactance)2.2 相移2.3 感应现象 3、RL滤波器4、总结 在之前有 交流电阻的文章中&#xff0c;我们已经看到电阻器在正常频率下的直流或交流状态下的行为是相同的。 然而&#xff0c;其他…

吃透进程地址空间,理清OS内存管理机制

文章目录 一、前言二、细说进程地址空间1、一段测试的代码2、引入地址空间① 富豪与他的私生子&#x1f468;② 38线竟是这么来的&#xff01;③ 地址空间的深层理解 三、分页 & 虚拟地址空间1、页表的概念2、疑难解答&#xff1a;为何父子进程没有发生同步修改&#xff1f…

注意点细节

部署esxi: VLAN 装esxi的时候如果没有设置trunk就不要设置VLAN&#xff0c; 否则无法访问 。 设置了trunk接口才设置VLAN&#xff0c;否则无法访问 部署esxi: DNS dns服务器配置&#xff1a; esxi 上的配置 部署ESXI &#xff1a;RAID 生成环境中需要先设置RAID 作为系统…

协同网络入侵检测CIDS

协同网络入侵检测CIDS 1、概念2、CIDS的分类3、解决办法4、CIDS模型5、挑战与不足 ⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计2598字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&…

Spring Security授权架构介绍

授权架构重点在于从 Authentication 中获得该认证所具有的权限 GrantedAuthority&#xff0c;以及对请求或路径设置访问所需权限。 GrantedAuthority 在之前的Spring Security&#xff1a;认证架构中&#xff0c;我们已经介绍了在 Authentication 中存储 GrantedAuthority 的…

21. 合并两个有序链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点&#xff0c;以及职场小菜鸡的生活。&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知…

自相矛盾的LLM幻觉:评估、检测、缓解10.30

自相矛盾的LLM幻觉&#xff1a;评估、检测、缓解 摘要引言相关工作定义和激励自我矛盾4 触发、检测和减轻自相矛盾的行为5 实例化到开放文本生成6 实验 摘要 大型语言模型&#xff08;Large LMs&#xff09;容易产生包含虚构内容的文本。其中一个重要问题是自相矛盾&#xff0…

windows server 2016-IIS静态服务器-设置详细过程

文章目录 1.打开仪表盘新建角色2.iis功能模块3.启动服务器4.优点 1.打开仪表盘新建角色 2.iis功能模块 能选上的尽量选上&#xff0c;除非知道自己用不上。 然后确认&#xff0c;下一步&#xff0c;安装。 3.启动服务器 搜索IIS&#xff0c;启动IIS管理器。 启动网站。 右…

【杂记】Filter过滤器和Interceptor拦截器的区别

过滤器Filter与拦截器Interception区别&#xff1f; 包的位置不同。 filter位于tomcat里面&#xff0c;interception位于Spring-webmvc filter位置&#xff1a; interceptor位置&#xff1a; 实现方式不同。在自定义的时候&#xff0c;filter我们可以实现Filter接口&#xf…

精品Python产品销售数据可视化大屏系统-仓库出入库进销存储

《[含文档PPT源码等]精品基于Python的产品销售数据可视化系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django …