JDK17 中的新特性初步了解

1. Switch 语句的增强

在jdk12 ,switch语句就可以不用写break了,直接写箭头和对应的值。

JDK17 中的新特性初步了解_第1张图片

jdk 17中, 加了一个逗号,用于匹配多对一。

JDK17 中的新特性初步了解_第2张图片

 如果要在每个case里写逻辑,可以写在花括号里。 在返回值的前面加上yield的关键字。

JDK17 中的新特性初步了解_第3张图片

 也可以对类型匹配

    public static void testPatternMatchSwitch(Object o) {
        switch (o) {
            case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");
            case String s -> System.out.println("判断是否为字符串,s:" + s);
            case Record p -> System.out.println("判断是否为Record类型: " + p.toString());
            case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + arr.length);
            case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);
            default -> System.out.println("Something else");
        }
    }

2. 字符串拼接

jdk15,提供了一个文本块的特性,可以直接三个双引号。 

JDK17 中的新特性初步了解_第4张图片

jdk17的时候提供两个字符, \是用于将两行连接为一行,\s允许前面加空格。 

JDK17 中的新特性初步了解_第5张图片

3. instanceof 的增强

jdk14 预览版,jdk16, jdk17 对 instanceof增强了。

JDK17 中的新特性初步了解_第6张图片

 4. 密封类(sealed classes)

1. 创建一个Animal 只能被  Cat 和 Dog类继承。

2. Animal ,Cat 和 Dog类必须都在同一个包下面。

3. 其它的类无法继承 Animal ,Cat 类 。 Dog可以被继承,因为是non-sealed修饰。注意Cat 和 Dog类只能被final和non-sealed修饰

public abstract sealed class Animal permits Cat, Dog {
}

/**
 * Final 代表 cat 无法再次被子类继承
 */
public final class Cat extends Animal {
}
/**
 * non-sealed 代表可以被再次继承
 */
public non-sealed class Dog extends Animal{
}

优点: 更安全,可控,易维护。

5. Record类

类似于lombok中的属性只读对象

record 类 提供了全参的构造方法,get方法,没有set方法。

public record RecordExample(Long id, String name) {
}

查看字节码会发现,其实java的编译器给我们在编译的生成了构造方法和get方法。

public record RecordExample(Long id, String name) {
    public RecordExample(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long id() {
        return this.id;
    }

    public String name() {
        return this.name;
    }
}

测试一下Record中的equal方法。会发现只要属性相同,结果是相同的。

public class TestRecord {

    public static void main(String[] args) {
        RecordExample example1 = new RecordExample(1l, "name1");
        RecordExample example2 = new RecordExample(1l, "name1");

        System.out.println(example1.equals(example2));
        
    }
}

6. 优化了空指针异常

1)、说明

Java15新特性,就是把NullPointerException异常的日志做了优化打印的更人性化。

2)、案例

可以看到,提示会更有指向性,意味着以后在复杂的生产环境排错过程中,你很可能不会再被空指针异常所困扰。
public class TestNPE {

    public static void main(String[] args) {
        User user = new User();
        user.getUserName().toLowerCase();
    }
}

运行之后的错误信息,可以很容易定位到哪里为null.

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because the return value of "com.sealed.example.User.getUserName()" is null
    at com.sealed.example.TestNPE.main(TestNPE.java:8)

6. ZGC垃圾收集器

jdk11就有了 , jdk15 已经正式转正, jdk17 zgc已经很成熟了。

ZGC的优点是,垃圾回收不卡顿。也就是说没有了STW- stop the world. 卡的时间是小于10ms.

堆内存可以设置很大,甚至可以是T级别。

ZGC 高吞吐。

JDK17 中的新特性初步了解_第7张图片

ZGC 低延迟

JDK17 中的新特性初步了解_第8张图片

 很小的 pause time.JDK17 中的新特性初步了解_第9张图片

更少的额外资源利用。JDK17 中的新特性初步了解_第10张图片

GC progress from JDK 8 to JDK 17

你可能感兴趣的:(JDK17,java,开发语言)