ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

part3 jdk17新特性详解

2026/9/28 2:27:33 拓冰建站 浏览量
part3 jdk17新特性详解
  1. switch case 匹配

  2. 多行字符串处理
    在这里插入图片描述

    public class htmlHandler {public static void main(String[] args) {//jdk17处理多行字符方式String html2= """<html>\<body>\s<h1>helloworld</h1></body></html>""";}
    }jdk17提供了两个转义符:\ 置于行尾  转成一行\s 单个空白字符
    1. instance of 增强

      jdk17之前,需要强转

在这里插入图片描述

jdk17之后不需要类型强转

public class InstanceOf {public static void main(String[] args) {Object o=2;if(o instanceof  Integer i){System.out.println(i.intValue());}}
}
  1. 密封类/限制继承类(sealed class) :

    • 限制子类继承,防止子类变父类;
    • sealed修饰在父类或者接口上;
    • 子类必须使用final或non-sealed修饰 ;
    • 密封类的子类或父类必须放在同一个包中

    父接口:

    
    public abstract   sealed class Animal permits Dog, Cat {
    }

    子接口:

    
    non-sealed修饰的子类可以被子类继承package com.newfeature;import com.newfeature.Animal;public  non-sealed  class Dog extends Animal {
    }package com.newfeature.domain;import com.newfeature.Dog;public class HaShiQi extends Dog {
    }final修饰的子类无法被继承package com.newfeature;import com.newfeature.Animal;public final class Cat extends Animal {
    }

密封类的优点:1.更加安全 ,避免不必要的继承; 2.更加可控,可以限制类的包范围

  1. Record类,类似lombok的属性只读对象;提供全参的构造方法,以及只读的get方法,没有set
package com.newfeature;public record RecordUser(Long userId,String userName) {
}package com.newfeature;public class RecordDemo {public static void main(String[] args) {RecordUser recordUser=new RecordUser(1L,"heihe");RecordUser recordUser1=new RecordUser(1L,"heihe");System.out.println("获取属性username:"+recordUser.userName()+","+recordUser.equals(recordUser1));}
}说明:该equal方法是record重新的方法,因此对象比较,内容相同,返回结果为true.

输出:

获取属性username:heihe,true

6.优化空指针异常信息:告诉哪个对象空指针了

创建类Dept,person

package com.newfeature;import com.newfeature.domain.Person;
import lombok.Data;@Data
public class Dept {private Integer DeptNo;private Person person;
}package com.newfeature.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {private String name;private Integer age;private Integer height;
}

创建测试类

package com.newfeature;public class NullPointerDemo {public static void main(String[] args) {Dept dept=new Dept();System.out.println(dept.getPerson().getAge());}
}

输出结果:

"C:\Program Files\Java\jdk-17\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.3\lib\idea_rt.jar=54479:C:\Program Files\JetBrains\IntelliJ IDEA 2021.3\bin" -Dfile.encoding=UTF-8 -classpath D:\ideaworkplace\ag\target\classes;C:\Users\Lenovo\.m2\repository\org\projectlombok\lombok\1.18.28\lombok-1.18.28.jar com.newfeature.NullPointerDemo
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.newfeature.domain.Person.getAge()" because the return value of "com.newfeature.Dept.getPerson()" is nullat com.newfeature.NullPointerDemo.main(NullPointerDemo.java:8)Process finished with exit code 1
  1. ZGC垃圾收集器:

    • 垃圾回收不卡顿

    • 垃圾回收stop the world小于10毫秒,堆内存可以设置很大,甚至是T级别的,减少gc的次数

​ 优点:ZGC吞吐量高,性能高,低延迟 相对jdk8/11

​ 使用方法: -xx:+useZGC

​ jdk8/11默认是 G1垃圾回收器

8.重写socket底层API

9.jdk飞行记录事件流(JFR Event):记录系统cpu资源等使用情况

10.EdDSA签名算法(爱德华兹曲线数字签名算法):Edwards-Curve Digital Signature Algorithm