Java 21 新特性的扫盲级别初体验

news2024/11/24 7:28:46

一、前言

JDK 21 于 2023 年 9 月发布,作为目前讨论热度最高的JDK,虽然大家都开玩笑说你发任你发,我用Java8,但是作为一个Javaer,对JDK21的新特性还是要有所了解的。

以下是 JDK 21 的新功能列表:

  • 虚拟线程
  • 序列集合
  • 记录模式
  • 字符串模板(预览)
  • 未命名模式和变量(预览)
  • 未命名类和实例主要方法(预览)
  • 作用域值(预览)
  • 结构化并发(预览)

JDK21下载地址:JDK官网

在这里插入图片描述

安装过程在这里就不赘述了,正常【下一步】就行了。

二、新特性体验

1. switch 模式匹配

可以通过switch表达式和语句的模式匹配来增强Java编程语言,可以针对多个模式测试表达式,每个模式都有一个特定的操作,从而可以简洁、安全地表达复杂的面向数据的查询。

1.1 支持返回值,不用写break

示例代码:

public class SwitchTest {

    public static void main(String[] args) {
        String unit = "cm";
        String str = switch (unit) {
            case "cm" -> "厘米";
            case "m" -> "米";
            case "mm" -> "毫米";
            case "km" -> "千米";
            default -> "错误";
        };
        System.out.println(str);
    }
}

测试结果:

在这里插入图片描述

注意:如果执行结果乱码,可以参考如下操作进行:

  1. 增加VM参数

    在这里插入图片描述

  2. 修改文件编码

    在这里插入图片描述

1.2 如果需要执行多行代码再返回,可使用yield关键字

示例代码:

public class SwitchTest {

    public static void main(String[] args) {
        String unit = "cm";
        String str = switch (unit) {
            case "cm" -> {
                System.out.println("我在测试呢...");
                yield "厘米";
            }
            case "m" -> "米";
            case "mm" -> "毫米";
            case "km" -> "千米";
            default -> "错误";
        };
        System.out.println(str);
    }
}
1.3 多值匹配

示例代码:

public class SwitchTest {

    public static void main(String[] args) {
        String unit = "cm";
        String str = switch (unit) {
            case "cm", "m" -> "厘米";
            case "mm" -> "毫米";
            case "km" -> "千米";
            default -> "错误";
        };
        System.out.println(str);
    }
}
1.4 null值处理

示例代码:

public class SwitchTest {

    public static void main(String[] args) {
        String unit = null;
        String str = switch (unit) {
            case "cm", "m" -> "厘米";
            case "mm" -> "毫米";
            case "km" -> "千米";
            case null -> "未知";
            default -> "错误";
        };
        System.out.println(str);
    }
}
1.5 匹配增强

示例代码:

public class SwitchTest {

    public static void main(String[] args) {
        Double obj = 0.0d;
        String str = 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();
        };
        System.out.println(str);
    }
}

2. 记录模式

记录模式,也就是记录模式匹配,英文为“Record Patterns”,记录模式匹配是指自动匹配Record记录类,从而简化代码。Record记录会自动生成了构造函数、getter、equals、hashCode、toString等方法,简化代码的编写,类似于lombok插件的@Data注解,但是对象属性只读,只有get方法,没有set方法。

  • 使用class

    public class User {
        private String name;
    
        private Integer age;
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
    
        public Integer getAge() {
            return age;
        }
        
    }
    
  • 使用record

    public record User(String name, Integer age) {
    }
    

3. 字符串模板

示例代码:

public class StrTest {

    public static void main(String[] args) {
        String name = "JDK21";
        String message = STR."Hello \{name}!";
        System.out.println(message);
    }
}

注意这是预览功能,默认禁用,我们需要使用--enable-preview启用字符串模板。

在Idea中,我们需要额外设置:

在这里插入图片描述

--enable-preview --source 21 -Xlint:preview

4. 顺序集合

SequencedSet 接口对于具有有序元素的 Set 非常有用,特别是当您必须执行某些操作(例如检索或删除第一个或最后一个索引处的元素)时。它还提供了一种反转元素的方法。

  • List

    import java.util.LinkedHashSet;
    import java.util.SequencedSet;
    
    public class ListTest {
        public static void main(String[] args) {
            SequencedSet<String> values = new LinkedHashSet<>();
            values.add("one");
            values.add("two");
            System.out.println(values); // [one, two]
    
            values.addFirst("zero");
            System.out.println(values); // [zero, one, two]
            values.addFirst("one");
            System.out.println(values); // [one, zero, two]
    
            values.addLast("three");
            System.out.println(values); // [one, zero, two, three]
            
    
            SequencedSet<String> reversedSet = values.reversed();
            System.out.println(reversedSet); // [three, two, zero, one]
        }
    }
    
  • Map

    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.SequencedMap;
    
    public class MapTest {
        public static void main(String[] args) {
            SequencedMap<String, Integer> myMap = new LinkedHashMap<>();
            myMap.put("one", 1);
            myMap.put("two", 2);
            System.out.println(myMap); // {one=1, two=2}
    
            Map.Entry<String, Integer> firstEntry = myMap.firstEntry();
            System.out.println(firstEntry); // one=1
    
            Map.Entry<String, Integer> lastEntry = myMap.lastEntry();
            System.out.println(lastEntry); // two=2
    
            myMap.putFirst("zero", 0);
            System.out.println(myMap); // {zero=0, one=1, two=2}
            myMap.putFirst("one", -1);
            System.out.println(myMap); // {one=-1, zero=0, two=2}
    
            Map.Entry<String, Integer> polledFirstEntry = myMap.pollFirstEntry();
            System.out.println(polledFirstEntry); // one=-1
            System.out.println(myMap); // {zero=0, two=2}
    
            SequencedMap<String, Integer> reversedMap = myMap.reversed();
            System.out.println(reversedMap); // {two=2, zero=0}
        }
    }
    

5. 虚拟线程

虚拟线程是Jdk21的重头戏,从 Java 代码的角度来看,虚拟线程感觉就像普通线程,但它们没有 1:1 映射到操作系统/平台线程。它是从虚拟线程到载体线程进而到操作系统线程的M:N映射。

虚拟线程的一些优点:

  • 提高应用程序吞吐量

  • 提高应用程序可用性

  • 减少内存消耗

示例代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class VirtualThreadsTest {
    public static void main(String[] args) {
        ExecutorService executor =  Executors.newVirtualThreadPerTaskExecutor();

        for (int i = 0; i < 10; i++) {
            int taskId = i;
            executor.execute(() -> {
                System.out.println("Task " + taskId + " is running on virtual thread: " + Thread.currentThread().getName());
            });
        }
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executor.shutdown();
    }

}

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

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

相关文章

初阶数据结构之---导论,算法时间复杂度和空间复杂度(C语言)

说在整个初阶数据结构开头 数据结构其实也学了挺长时间了&#xff0c;说着是要刷题所以才没怎么去写关于数据结构方面的内容。数据结构作为计算机中及其重要的一环&#xff0c;如果不趁着假期系统整理一下着实可惜&#xff0c;我这里构想的是将初阶数据结构和高阶数据结构&…

Servlet原理学习

一、网站架构和Servlet技术体系架构 1.网站架构 现在的网站架构分为 B/S架构和C/S的架构两种。 这种“B/S”结构有很多好处&#xff0c;维护和升级方式更简单&#xff0c;客户端是浏览器&#xff0c;基本不需要维护&#xff0c;只需要维护升级服务器端就可以&#xff0c; C/S结…

[AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

首先你必须有巨魔才能使用&#xff01;&#xff01; 不会安装的&#xff0c;还没安装的移步这里&#xff0c;ios17 以上目前装不了&#xff0c;别看了&#xff1a;永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【Audio…

并发List、Set、ConcurrentHashMap底层原理

并发List、Set、ConcurrentHashMap底层原理 ArrayList: List特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 存储结构&#xff1a;底层采用数组来实现 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Clon…

【医学大模型 补全主诉】BioGPT + LSTM 自动补全医院紧急部门主诉

BioGPT LSTM 自动补全医院紧急部门主诉 问题&#xff1a;针对在紧急部门中自动补全主诉的问题子问题1: 提高主诉记录的准确性子问题2: 加快主诉记录的速度子问题3: 统一医疗术语的使用子问题4: 减少打字错误和误解子问题5: 提高非特定主诉的处理能力 解法数据预处理神经网络方…

选择结构switch

一、执行流程 所有case都和表达式的值不匹配&#xff0c;就会执行default语句体部分 从被匹配的位置开始执行&#xff0c;如果遇到break&#xff0c;那么退出选择结构 二、注意事项 1、case后面的【常量值】不能重复&#xff0c;不然编译器会报错 2、switch后面的小括号只…

数字化转型导师坚鹏:政府数字化转型之数字化技术

政府数字化转型之数字化技术 ——物联网、云计算、大数据、人工智能、虚拟现实、区块链、数字孪生、元宇宙等综合解析及应用 课程背景&#xff1a; 数字化背景下&#xff0c;很多政府存在以下问题&#xff1a; 不清楚新技术的发展现状&#xff1f; 不清楚新技术的重要应…

las数据转pcd数据

las数据转pcd数据 一、算法原理1.介绍las2.主要函数 二、代码三、结果展示3.1 las数据3.2 las转换为pcd 四、相关数据链接 一、算法原理 1.介绍las LAS文件按每条扫描线排列方式存放数据,包括激光点的三维坐标、多次回波信息、强度信息、扫描角度、分类信息、飞行航带信息、飞…

【已解决】d:\recording\2A327.mp3 (拒绝访问。)

在用JAVA程序&#xff0c;下载音频到本地文件夹的时候&#xff0c;显示拒绝访问。 一开始我以为是文件夹没有权限&#xff0c;但是在我赋予了写入权限后&#xff0c;仍然出现拒绝访问的提示。 我观察了一下&#xff0c;保存到本地的时候&#xff0c;多写了一层文件夹。因为到这…

【Git】:初识git

初识git 一.创建git仓库二.管理文件三.认识.git内部结构 一.创建git仓库 1.安装git 使用yum install git -y即可安装git。 2.创建仓库 首先创建一个git目录。 3.初始化仓库 这里面有很多内容&#xff0c;后面会将&#xff0c;主要是用来进行追踪的。 4.配置name和email 当然也…

WEB服务器的超级防护——安全WAF

随着网络和信息技术的不断发展&#xff0c;特别是互联网的广泛普及和应用&#xff0c;网络正在逐步改变人类的生活和工作方式。越来越多的政府和企业组织建立了依赖于网络的业务信息系统&#xff0c;例如电子政务、网络办公等。网络也对社会各行各业产生了巨大的影响&#xff0…

【Java基础知识(1)】对象在内存中的存储

Java对象是如何在内存中存储的&#xff1f; 在Java中&#xff0c;所有的对象被动态地分配在堆中。这和C不同&#xff0c;C允许对象被存储在堆或者栈中。 参考Oracle官方文档&#xff1a;官方文档说明 在Java中创建字符串对象的2种方法&#xff1a; 1、 使用String关键字&am…

Uiautomator2实现Android自动化测试详解

目录 1、UIautomator2框架原理 2、UIautomator2使用 2.1、安装 2.2、元素定位工具-weditor 2.3、设备连接 2.4、全局配置 2.4.1、通过settings设置 2.4.2、通过属性设置 2.5、APP相关操作 2.5.1、安装应用 2.5.2、启动应用 2.5.3、等待应用启动 2.5.4、结束应用 …

【机器学习笔记】 15 机器学习项目流程

机器学习的一般步骤 数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序&#xff0c;包括检查数据一致性&#xff0c;处理无效值和缺失值等。与问卷审核不同&#xff0c;录入后的数据清理一般是由计算机而不是人工完成。 探索性数据分析(EDA 探索性数据…

从gradient_checkpointing_enable中学习

1.背景 最近在使用官网的教程训练chatGLM3,但是出现了“RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn”错误,查阅了官方的文档,目前这个问题还没什么解决方案 但是其中有人回复说:是注释掉503行的model.gradient_checkpointing_e…

手持三防平板丨国产化加固平板丨国产三防平板发展的意义是什么?

随着现代科技的快速发展&#xff0c;平板电脑在我们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的平板电脑只能在普通的环境中使用&#xff0c;而无法在恶劣的环境中使用&#xff0c;例如在高海拔、高温、高湿度、沙漠等环境中&#xff0c;传统平板电脑往往会出现故…

OpenHarmony—UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动三方支付UIAbility&#xff09;。 本章节将从如下场…

电脑数据丢失怎么办?5 种免费数据恢复软件能帮到您

我们存储在计算机中的个人和专业数据如果丢失&#xff0c;可能会给我们带来经济和精神上的困扰。有许多情况会导致此类数据丢失&#xff1b;其中一些包括意外删除、硬盘驱动器故障、软件崩溃、病毒攻击等。 5 种最佳免费数据恢复软件 为防止此类事故&#xff0c;建议定期备份计…

智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套

随着城市化进程的加速&#xff0c;人们对城市生活质量的要求也越来越高。作为智慧城市建设的一项重要组成部分&#xff0c;多功能城市智慧驿站应运而生。它集合了信息技术、设计美学、结构工艺、系统集成、环保节能等多个亮点&#xff0c;将现代科技与城市生活相融合&#xff0…

RK3568平台 有线以太网接口之MAC芯片与PHY芯片

一.平台网络网络通路 平台有线以太网通路&#xff1a;有线以太网一般插入的是RJ45 座要与 PHY 芯片&#xff08;RTL8306M&#xff09;连接在一起&#xff0c;但是中间需要一个网络变压器&#xff0c;网络变压器经过模数转换后到达网卡(RTL8111)转换为帧数据后到达SOC。 二.网络…