JDK17的一些新特性

简介

当前JDK最新版本是22(Oracle官方网站), 本文主要演示一些关于JDK17的新特性
如果你的项目想接入AI, 或者想升级较新的版本架构, 那么我相信JDK17是必然绕不开的一项选择
因为比如Java最常用的框架Spring, 在3.x版本之后要求最低的JDK版本为17, 包括2024年Spring加入了新的中间件Spring AI, 也是要求Spring的版本在3.x, 或许在不久的将来2.x的Spring版本将彻底沦为过去式
在这里插入图片描述

JDK17语法上的新特性 带有格式的字符串返回方式有所区别(例如HTML)

// 这是JDK8返回HTML文本的方式
public static final String getHtmlJDK8() {
    return "<html>\n" +
        " <body>\n" +
        " <p>Hello, world!</p>\n" +
        " </body>\n" +
        "</html>";
}
// 这是JDK17返回HTML文本的方式
public static final String getHtmlJDK17() {
    return """
        <html>
            <body>
                <p>Hello, world!</p>
            </body>
        </html>
        """;
}

空指针异常增强 [点赞]

这个特性升级的太棒了, 在JDK8中, 对于空指针异常, 我们只能得到哪一行报错了, 具体是因为这一行的哪一段具体的代码, 我们是不知道的, 但是JDK17它可以告诉你具体的原因, 示例如下

JDK8
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length());
    }

在这里插入图片描述

JDK17
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length());
    }

在这里插入图片描述

record 关键字返回

我们在JDK8中创建一个返回结果的映射类, 类中要声明属性,构造函数, Getter, Setter, ToString 等等方法, 为此Lombok还提供了注解, 使我们尽量减少繁琐的操作, 在JDK17中这些操作都不需要了, 一个record关键字搞定

声明方式[推荐]
/**
 * 用户基本信息
 * @author 随风
 */
public record User(String name, Integer age, String email) {

}

在这里插入图片描述

使用方式

在这里插入图片描述

Switch表达式写法的修改[推荐]

1.可以直接写返回值了 不用声明一个变量去接收了
2.不需要再写break了
3.case支持多条件了

    public static String getResult(String input) {
        return switch (input) {
            case "1" -> "输入了1";
            case "2" -> "输入了2";
            case "3" -> "输入了3";
            case "4","5" -> "命中了4和5";
            default -> "默认值";
        };
    }

在这里插入图片描述

私有接口

所谓的私有, 就是这个东西只能我自己用, 不给别人使用,别人也不可见, 其实就是Java的一个特性封装, 使用private进行修饰, 只不过之前是不允许用private去修饰一个接口, 不信你在JDK8上试试, 肯定会报错, JDK17允许了, 当用private去修饰接口的时候, 这个接口是不需要实现类实现的, 也不能被直接引用, 除了default修饰以外的接口也不能使用, 因为正常的接口是没有body体的

    /**
     * 我们可以直接调用test获取到getResult的接口
     * 但是不能直接调用getResult方法,接口中除了default修饰以外的方法也不能使用getResult方法
     * @return String
     */
    default String test() {
        return getResult();
    }

    /**
     * 私有接口
     * @return String
     */
    private String getResult() {
        return "1";
    }

模式匹配 instanceof 写法修改

instanceof之后不再需要进行类型转化的代码编写了, 示例如下

JDK8
    public static void judgmentTypeAndGetResult(Object value) {
        if (value instanceof String) {
            String v = (String) value;
            System.out.println("String类型" + v.toUpperCase());
        } else if (value instanceof Integer) {
            Integer v = (Integer) value;
            System.out.println("整型" + v.longValue());
        }
    }
JDK17
    public static void judgmentTypeAndGetResult(Object value) {
        if (value instanceof String v) {
            System.out.println("String类型" + v);
        } else if (value instanceof Integer v) {
            System.out.println("整型" + v);
        }
    }

在这里插入图片描述

集合类新的初始化方法

例如Set集合的初始化

Set<String> set = Set.of("a", "b", "c");

String类的新方法

repeat:重复生成字符串
isBlank:不用在引入第三方库就可以实现字符串判空了
strip:去除字符串两边的空格,支持全角和半角,之前的trim只支持半角

全新的垃圾回收器ZGC(JDK11就引入了)

它是为了解决大规模堆内存下的低延迟需求而设计的,官方宣称ZGC的垃圾回收停顿时间不超过10ms,能支持高达16TB的堆空间,并且停顿时间不会随着堆的增大而增加,ZGC在JDK11中作为实验性特性引入,并在后续版本中逐步成熟,最终成为JDK 17中的一个稳定的垃圾回收器选项,具体细节可以查阅官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值