JDK17必须要学习掌握的新特性汇总

Java基础 潘老师 11个月前 (05-26) 1151 ℃ (0) 扫码查看

你是不是还在使用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吗?如果会,那赶紧学习起来吧!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/6410.html
喜欢 (3)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】