你是不是还在使用JDK8版本写着JDK5的代码?现在比较流行的LTS(长期支持版)目前有两个JDK11和JDK17,如果新项目立项大趋势基本是JDK17了,毕竟JDK17真的是太香了,非常有必要和大家介绍总结下JDK17必须要学习和掌握的一些新特性,不然真的就out啦!
当然这些部分新特性,可能是在11、12、13等等版本中就出现了,但是对于从JDK8转过来的小伙伴还是非常有必要在此处汇总下,一起放到JDK17中去演示,我们一起来看下吧。
1、JDK17对switch语句的增强
1)支持返回值
原写法:
@Test
void testSwitch(){
String day = "MONDAY";
switch (day) {
case "MONDAY":
System.out.println("星期1");
break;
case "TUESDAY":
System.out.println("星期2");
break;
case "WEDNESDAY":
System.out.println("星期3");
break;
case "THURSDAY":
System.out.println("星期4");
break;
case "FRIDAY":
System.out.println("星期5");
break;
case "SATURDAY":
System.out.println("星期6");
break;
case "SUNDAY":
System.out.println("星期7");
break;
default:
System.out.println("未知");
break;
}
}
JDK17新写法:
//单匹配,不用再写break,支持返回值
@Test
void testSwitch(){
String day = "MONDAY";
String i = switch (day) {
case "MONDAY" -> "星期1";
case "TUESDAY" -> "星期2";
case "WEDNESDAY" -> "星期3";
case "THURSDAY" -> "星期4";
case "FRIDAY" -> "星期5";
case "SATURDAY" -> "星期6";
case "SUNDAY" -> "星期7";
default -> "未知";
};
System.out.println(i);
}
// 执行多行代码并返回,使用yield返回
@Test
void testSwitch(){
String day = "MONDAY";
String i = switch (day) {
case "MONDAY" -> {
System.out.println("又要上班了...");
yield "星期1";
};
case "TUESDAY" -> "星期2";
case "WEDNESDAY" -> "星期3";
case "THURSDAY" -> "星期4";
case "FRIDAY" -> "星期5";
case "SATURDAY" -> "星期6";
case "SUNDAY" -> "星期7";
default -> "未知";
};
System.out.println(i);
}
// 多匹配,直接逗号分割
@Test
void testSwitch(){
String day = "MONDAY";
int i = switch (day) {
case "MONDAY" -> "星期 1";
case "TUESDAY" -> "星期2";
case "WEDNESDAY" -> "星期3";
case "THURSDAY" -> "星期4";
case "FRIDAY" -> "星期5";
case "SATURDAY","SUNDAY" -> "周末";
default -> "未知";
};
System.out.println(i);
}
2)switch开始支持instanceof
switch (obj) {
case Integer i -> System.out.println(i);
case Long l -> System.out.println(l);
case Double d -> System.out.println(d);
case String s -> System.out.println(s);
default -> System.out.println("UNKNOWN");
}
2、JDK17对多行字符串支持
以前一行字符串太长需要换行的写法:
String html = "<html>\n" +
" <body>\n" +
" <h1>hello world</h1>\n" +
" </body>\n" +
"</html>\n";
JDK17之后可以直接使用"""
String html ="""
<html>
<body>
<h1>hello world</h1>
</body>
</html>
"""
注意:
\
:置于行尾,用来将两行连接为一行
\s
:单个空白字符
如果需要拼接变量还是只能在字符串内部使用%s
占位符替代,然后使用String.format(html,"替换内容")
3、JDK17 instanceof增强
现在判断类型如果满足该类型可以直接赋值,无需再强制转换。
原写法:
Object obj = 1;
if(obj instanceof Integer) {
Integer i = (Integer) obj;
System.out.println(i.intValue());
}else if(obj instanceof String){
String s = (String) obj;
System.out.println(s);
}
现写法:
Object obj = 1;
if(obj instanceof Integer i) {
System.out.println(i.intValue());
}else if(obj instanceof String s){
System.out.println(s);
}
是不是非常的方便简洁。
4、密封类
密封类可以理解为限制继承类,可以指定该类只能被某些子类继承,语法类似如下:
Person类被 sealed 修饰,只允许(permits)Male和Female类继承,继承的类必须有 final 或者 no-sealed 来修饰。
public static void main(String[] args) {
Male male = new Male();
male.eat();
Female female = new Female();
female.eat();
}
public abstract sealed class Person permits Male, Female {
abstract void eat();
}
public final class Male extends Person {
@Override
public void eat() {
System.out.println("male eat");
}
}
public non-sealed class Female extends Person {
@Override
public void eat() {
System.out.println("female eat");
}
}
以上Person
就是个密封类,限制只允许Male和Female类继承。
注意:
1)接口被也支持被 sealed 修饰
2)这3个类必须要在同一个包下,而且Male和Feamle不能间接继承Person,必须直接继承。
3)no-sealed修饰的子类可以被继续继承
5、Record类
Record类类似Lombok属性只读对象,只有get方法,没有set方法,演示如下:
// record 坐标类
public record Coordinate(int x,int y){
}
// 创建对象
@Test
void test(){
Coordinate c1 = new Coordinate(1,2);
Coordinate c2 = new Coordinate(1,2);
//注意不是getX()
System.out.println(c1.x());
// 我们会发现equals打印结果是true,因为重写了equals,属性值相同则认为相等
System.out.println(c1.equals(c2));
}
6、优化了空指针异常信息
以前如果多个对象连续调用方法或属性,如果改行代码报空指针,很难确定是哪个对象报的,现在JDK17在异常信息中直接帮你定位到哪个对象报的NPE异常,真是太方便了,妈妈再也不用担心我找不到空指针异常了。
比如执行代码:employee.department().company().name() 报NPE,直接定位到时company()方法为null导致了。
7、ZGC垃圾回收器
JDK17的ZGC垃圾回收器性能强劲,垃圾回收不卡顿,Java开发不用愁。
通过以上吞吐量指标,我们可以看到与旧版本相比,所有收集器都有了明显的进步,其中ZGC的提升最大。在此次测试中,G1和 Parallel的原始吞吐量更好,但增大了堆空间后,ZGC 弥补了这一差距。
注意:添加以下VM选项即可开启ZGC:
-XX:+UseZGC
总结
以上就是JDK17的新特性,是不非常的强大有实用,如果你是开发新项目,会选择使用JDK17吗?如果会,那赶紧学习起来吧!