如果你在寻找长期支持并且性能稳定的 JDK 版本,我建议选择 JDK 17 LTS(Long-Term Support)。JDK 17 是 OpenJDK 的 LTS 版本,它提供了长期的支持和更新,通常会得到多年的维护。
JDK 17 LTS 提供了许多性能优化和改进,同时也包括了新的功能和增强。此外,作为一个 LTS 版本,它将得到长期的支持和更新,包括安全修复、性能改进和其他维护。这使得 JDK 17 成为一个值得考虑的稳定和可靠的选择,无论是用于生产环境还是其他用途。
当然,在选择 JDK 版本时,还要考虑你的具体需求和环境。但总的来说,JDK 17 LTS 是一个很好的选择,既提供了稳定性和性能,又能够获得长期的支持。
JDK11->JDK12->JDK15->JDK11
switch语句增强
JDK12->JDK17(多值)
多值判断处理
String name = switch(name){
case "三年","四年" -> "一楼";
case "五年","六年" -> "二楼";
default -> "未知";
};
多行代码处理
String name = switch(name){
case "三年","四年" -> {
System.out.println("一楼");
yield "一楼";
};
case "五年","六年" -> {
System.out.println("二楼");
yield "二楼";
};
default -> {
System.out.println("未知")
yield "未知";
};
};
支持对象类型匹配
private String typeSwith(Object o){
return switch(type){
case null -> "type is null";
case Integer i -> String.format("Integer i : %s", i);
case String s -> String.format("String s : %s", s);
default -> o.toString();
};
}
字符串拼接解决
- 斜杆【\】置于行尾,用来将两行连接为一行
- 斜杆斯【\s】单个空白字符
String html = """
<html>
<body>
<h1>Hello, JDK17 to %s<\h1>
<\body>
<\html>
""";
System.out.println(String.format(html,"Lucky"));
instanceof增强
是否符合哪个类型,不在使用强转,直接匹配当做该类型处理,增强代码可读性
JDK14->JDK16->JDK17
Object ojb=1;
if(obj instanceof Integer i){
System.out.println(i.intValue());
} else if (obj instanceof Sgtring s){
System.out.println(s.charAt(0));
}
密封类
密封类(Sealed Classes)
限制子类继承,修饰父类和接口特定的类型,防止子类变父类
//父水果 > 苹果 橘子
public abstract sealed class Fruit permits Apple, Orange {}
//子-> 苹果(使用关键字final)
public final class Apple extends Fruit {}
//子-> 橘子(使用关键字)
public non-sealed class Apple extends Orange {}
//使用区别:
//关键字final:无法再被子类继承
//关键字non-sealed:可以再被子类继承
//注意:
//1、必须在同包里面com.lucky.xx:Fruit.java Apple.java Orange.java
//2、子类直接继承密封类
//优点:安全、可控
//1、密封类更加的安全,可以限制子类继承,限制了不必要的继承
//2、密封类更加的可控,密封类限制范围,只能包下面类继承,减少代码的复杂性,更加易于维护
Record类
类型属性只读对象,可以用在场景比如:坐标。
它可以帮助我们构造全参的构造方法,提供只读的属性方法,未提供设置属性的方法。
// class变成record, 属性不在大括号里面,而在将方法声明参数里面
public record Coordinate(String longitude, String latitude){
}
// class编译文件
public record Coordinate(String longitude, String latitude){
public Coordinate(String longitude, String latitude) {
this.longitude = longitude;
this.latitude = latitude;
}
public String longitude { return this.longitude; }
public String latitude { return this.latitude ; }
}
// 使用熟悉需要new时候就要设置好属性
使用熟悉需要new时候就要设置好属性
public class CoordinateDemo {
public static void main(String[] args){
Coordinate coordinate1 = new Coordinate("x","y");
Coordinate coordinate2 = new Coordinate("x","y");
System.out.println(coordinate1.equals(coordinate2));
// 返回对象(属性)相等:true
// 因为底层进行record除了帮助我们生成全参构造方法、只读属性以外,还会帮忙重写equals法\hashCode法\toString方法
}
}
优化空指针异常
JDK14->JDK17
原先只知道哪一行,然后猜哪一项对象空,现在直接告诉我们哪一个对象为null
CoordinateDemo.java::11
Cannot invoke "xxx.CoordinateDemo.longitude()" because the return value of "xxxx...longitude()" is null
ZGC垃圾收集器
JDK11诞生->JDK15转正->JDK17成熟
好处:垃圾回收不卡顿,java开发不用担心。
STW:垃圾回收触发的时候,我们jvm内存会冻结,所以线程停止运行,发生卡顿。减少卡顿时间,ZGC小于毫秒,堆内存设置很大,触发GC速度减少,提升性能。。。