支持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));
//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