Java17(LTS Long Term Support)特性

支持JDK17的主流技术框架

  1. spring framework 6.x
  2. springboot 3.x
  3. kafka 3.0(不在支持jdk8)
  4. jenkins 2.357(必须jdk11起步)
  5. James Gosling表示赶紧弃用Java8,使用性能最好的JDK17
  6. Chart GPT也推荐JDK17,从长期到性能来说。

JDK17的特性

swich语句增强

 //jdk12推出的
        var name = "shb";
        String alis = switch (name) {
            case "周瑜" -> "公瑾";
            case "徐庶" -> "元直";
            case "诸葛亮" -> "卧龙";
            case "庞统" -> "凤雏";
            case "shb" -> "大佬";
            default -> "未知";
        };
        System.out.printf("alis" + alis);

        //jdk17增强的  "诸葛亮","徐庶","庞统" 多个前提条件
        String coutry = switch (name) {
            case "周瑜" -> "东吴";
            case "诸葛亮", "徐庶", "庞统" -> "蜀汉";
            case "shb" -> "中华人民共和国";
            default -> "未知";
        };
        System.out.printf("coutry" + coutry);
        //方法执行{},返回结果 yield关键字
        String method = switch (name) {
            case "周瑜" -> {
                Thread.sleep(1000);
                yield "东吴";
            }
            case "诸葛亮", "徐庶", "庞统" -> {
                System.out.println(666);
                yield "蜀汉";
            }
            case "shb" -> {
                System.out.println("民族伟大复兴");
                yield "中华人民共和国";
            }
            default -> "未知";
        };

jdk17及以后版本的多行字符串处理方式 SQL、JSON、HTML

    	//jdk17及以后版本的多行字符串处理方式 SQL、JSON、HTML
        // \ :置于行尾,用来将两行连接为一行
        // \s:单个空白字符
        String html = """
                <html>\
                    <body>
                        <h1>hello,world %s</h1>
                    </body>
                </html>\s
                """;
        System.out.println(html);
        System.out.println(String.format(html,"shb"));

jdk17对 instanceof 增强

   //jdk17对 instanceof 增强
        //jdk14已经增强
        Object o = "1";
        if (o instanceof Integer i) {
            System.out.println(i.intValue());
        } else if (o instanceof String s) {
            System.out.println(s.charAt(0));
        }

密封类(Sealed Classes)

密封类的实现特征有哪些?

1. 密封类(Sealed Classes)一般修饰父类、接口

2. permits许可指定类来继承Dog,Cat,子类必须指定:

final表示无法在继承

non-sealed 可以被子类在继承)

3. 密封类和子类必须在同一个包package底下,否则报错

4. 密封类子类必须直接继承密封类才生效,中间不能间隔其他类例如:Dog extends Animal Animal是密封类

密封类有什么好处?

1.密封类限制继承,更加的安全

2.更加可控,减少代码复杂性 更易于理解

package com.map.helper.facade.om.controller;

/**
 * @author songhaibo
 * @description
 * 密封类的实现特征有哪些?
 * 1. 密封类(Sealed Classes)一般修饰父类、接口
 * 2. permits许可指定类来继承Dog,Cat,子类必须指定:
 *                              final表示无法在继承
 *                              non-sealed 可以被子类在继承)
 * 3. 密封类和子类必须在同一个包package底下,否则报错
 * 4. 密封类子类必须直接继承密封类才生效,中间不能间隔其他类例如:Dog extends Animal Animal是密封类
 * 密封类有什么好处?
 *     答:1.密封类限制继承,更加的安全
 *        2.更加可控,减少代码复杂性 更易于理解
 *
 *
 * @date 2023-11-28 19:35
 */
public abstract sealed class  Animal permits Dog,Cat {
}



package com.map.helper.facade.om.controller;

/**
 * @author songhaibo
 * @description
 * final表示无法在继承
 * non-sealed 可以被子类在继承
 * @date 2023-11-28 19:39
 */
public final class Cat extends Animal {
}

package com.map.helper.facade.om.controller;

/**
 * @author songhaibo
 * @description
 * final表示无法在继承
 * non-sealed 可以被子类在继承
 * @date 2023-11-28 19:39
 */
public non-sealed class Dog extends Animal {
}

Record类,类似lombok的属性只读对象

  1. 通过class文件能看到,它会默认生成有参构造,和获取单个属性的方法。但是没有设置属性的方法
  2. Record.equals()属性值相等就是相等的。因为Record重写equals了
  3. 使用场景:简单的javaBean,比如说坐标类,只有经纬度
/**
 * @author songhaibo
 * @description
 *
 * 通过class文件能看到,它会默认生成有参构造,和获取单个属性的方法。但是没有设置属性的方法
 * 使用场景:简单的javaBean,比如说坐标类,只有经纬度
 * @date 2023-11-28 19:54
 */
public record UserRecord(Long userId,
                         String userName) {
}

  public static void main(String[] args) {
        UserRecord userRecord = new UserRecord(1L, "shb");
        UserRecord userRecord1 = new UserRecord(1L, "shb");
        System.out.println(userRecord.userName());
        // true  Record.equals()属性值相等就是相等的。因为Record重写equals了。
        System.out.println(userRecord.equals(userRecord1));
        //false
        System.out.println(userRecord==userRecord1);
    }

优化空指针异常信息(妈妈再也不担心我找不到空指针异常是哪句代码了)

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "a" is null
at com.map.helper.facade.om.controller.RecordDemo.main(RecordDemo.java:12)

ZGC垃圾收集器(垃圾回收不卡顿,Java开发不用愁)

最大卡顿10毫秒以内,堆内存可以设置很大。具体单独出文章

国外大佬对比过这三种垃圾回收器,通过对比可以看出ZGC的吞吐量是最高的。当然不管是哪种垃圾回收器,JDK17的性能都是最高的。

因为ZGC设置的堆内存空间比较大,在这里G1延迟效率是最好的

综合对比能看出JDK17有很大的性能提升,如果考虑高性能的话毫不犹豫选择JDK17以及ZGC垃圾回收器!。

添加以下JVM选项即可开启ZGC:(目前11和17默认还是G1,需要手动指定)

-XX:+UseZGC

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值