支持JDK17的主流技术框架
- spring framework 6.x
- springboot 3.x
- kafka 3.0(不在支持jdk8)
- jenkins 2.357(必须jdk11起步)
- James Gosling表示赶紧弃用Java8,使用性能最好的JDK17
- 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的属性只读对象
- 通过class文件能看到,它会默认生成有参构造,和获取单个属性的方法。但是没有设置属性的方法
- Record.equals()属性值相等就是相等的。因为Record重写equals了
- 使用场景:简单的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));//falseSystem.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