简介
当前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中的一个稳定的垃圾回收器选项,具体细节可以查阅官方文档
370

被折叠的 条评论
为什么被折叠?



