• JDK17新特性


    为什么要升级JDK17

    image.png

    JDK17带来了哪些变化

    swtich语句增强

    // jdk8switch
    int statusCode = 0;
    String statusName = "";
    switch (statusCode) {
        case 1:
            statusName = "开始";
            break;
        case 2:
            statusName = "进行中";
            break;
        case 3:
            statusName = "结束";
            break;
        default:
            statusName = "未知";
            break;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 省略break,简化赋值
    // jdk17switch
    String statusName2 = switch (statusCode) {
        case 1 -> "开始";
        case 2 -> "进行中";
        case 3 -> "结束";
        default -> "未知";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.多值匹配

    // 17switch 多值匹配
    String statusName3 = switch (statusCode) {
        case 1, 2 -> "开始";
        case 3 -> "结束";
        default -> "未知";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.表达式(业务逻辑+返回值)

    // 17switch 表达式
    String statusName4 = switch (statusCode) {
        case 1, 2 -> {
            System.out.println("开始");
            yield "开始";
        }
        case 3 -> {
            System.out.println("结束");
            yield "结束";
        }
        default -> {
            System.out.println("未知");
            yield "未知";
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.类型推断(预览功能

    // 17switch 对象类型匹配
    Object obj = "hello";
    String statusName5 = switch (obj) {
        case String s -> s;
        case Integer i -> i.toString();
        default -> "未知";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    字符串拼接增强

    // java8 多行字符串拼接
    String str = "

    " + "Spring Boot应用可执行jar,启动器以及格式等等。" + "

    "
    ;
    • 1
    • 2
    • 3
    • 4

    1.多行字符串拼接优化

    // java17 多行字符串拼接
    String str2 = """
            

    Spring Boot应用可执行jar,启动器以及格式等等。

    """;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.\s单个空白字符

    // java17 多行字符串拼接 /s 表示空格
    String str3 = """
            

    Spring Boot应用可执行jar,启动器以及格式等等。\s

    """
    ;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.尾行加\两行连接为一行

    String str4 = """
            <p>
            Spring Boot应用可执行jar,启动器以及格式等等。\
            </p>
            """;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    instanceof增强

    // java8 instanceof
    Object obj = "hello";
    if (obj instanceof String) {
        String str = (String) obj;
        System.out.println(str);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    14预览版出现16正式使用

    // java17 instanceof
    if (obj instanceof String str) {
        System.out.println(str);
    }
    
    • 1
    • 2
    • 3
    • 4

    密封类

    什么是密封类?
    密封类是指在声明类的时候,可以使用sealed关键字来修饰,修饰后的类只能在本包中被继承,不能被其他类继承。
    优点:

    • 安全,可限制子类继承
    • 可控,限制继承范围在包内

    1.父类限定指定类继承

    public sealed class Shape permits Circle, Rectangle, Square {
        ···
    }
    
    • 1
    • 2
    • 3

    2.final修饰子类(无法再继承)

    public final class Circle extends Shape {
        ···
    }
    
    • 1
    • 2
    • 3

    3.non-sealed修饰子类()

    public non-sealed class Rectangle extends Shape {
        ···
    }
    
    • 1
    • 2
    • 3

    Record类

    类似于lombook,提供获取属性方法和有参构造,并重新equals和toString,没有读取属性的方法和无参构造。
    使用场景:坐标

     record Person(String name, int age) {
        public Person {
            if (age < 0) {
                throw new IllegalArgumentException(
                        "Age cannot be negative");
            }
        }
    }
    Person person = new Person("Bob", 20);
    System.out.println(person.name());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    空指针异常优化

    解决空指针只有行提示问题,可定位到具体对象

    Integer i = null;
    int res = i / 0;
    
    • 1
    • 2

    异常提示
    Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "i" is null

    ZGC垃圾收集器

    减少了STW内存冻结时间到亚秒基本,支持堆内存到TB

  • 相关阅读:
    回归预测|GWO-BPNN-Adaboost算法原理及其实现(Matlab)
    用时半个月,终于把2020年各大公司的Java面试题精选整理成文档了
    Java线程池详解
    引入Wukong让你的系统瞬间具备IOC能力
    度量BGP监测源数量对AS可见性的影响
    Spring基础:注解实现AOP
    SAP批量修改工单BAPI
    线程池优化
    怎么他们都有开源项目经历|手把手教你参与开源
    PyQt5学习笔记--多线程处理、数据交互
  • 原文地址:https://blog.csdn.net/cxy_LG/article/details/133425663