1. Switch 语句的增强
jdk12 ,switch语句不用写break了,直接写箭头和对应的值。
jdk 17中, 加了一个逗号,用于匹配多对一。
如果要在每个case里写逻辑,可以写在花括号里。 在返回值的前面加上yield的关键字。
也可以对类型匹配
public static void testPatternMatchSwitch(Object o) {switch (o) {case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");case String s -> System.out.println("判断是否为字符串,s:" + s);case Record p -> System.out.println("判断是否为Record类型: " + p.toString());case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + arr.length);case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);default -> System.out.println("Something else");}}
2. 字符串拼接
jdk15,提供了一个文本块的特性,可以直接三个双引号。
jdk17的时候提供两个字符, \是用于将两行连接为一行,\s允许前面加空格。
3. instanceof 的增强
jdk14 预览版,jdk16, jdk17 对 instanceof增强了。
4. 密封类(sealed classes)
1. 创建一个Animal 只能被 Cat 和 Dog类继承。
2. Animal ,Cat 和 Dog类必须都在同一个包下面。
3. 其它的类无法继承 Animal ,Cat 类 。 Dog可以被继承,因为是non-sealed修饰。注意Cat 和 Dog类只能被final和non-sealed修饰
public abstract sealed class Animal permits Cat, Dog {
}
/*** Final 代表 cat 无法再次被子类继承*/
public final class Cat extends Animal {
}
/*** non-sealed 代表可以被再次继承*/
public non-sealed class Dog extends Animal{
}
优点: 更安全,可控,易维护。
5. Record类
类似于lombok中的属性只读对象
record 类 提供了全参的构造方法,get方法,没有set方法。
public record RecordExample(Long id, String name) {
}
查看字节码会发现,其实java的编译器给我们在编译的生成了构造方法和get方法。
public record RecordExample(Long id, String name) {public RecordExample(Long id, String name) {this.id = id;this.name = name;}public Long id() {return this.id;}public String name() {return this.name;}
}
测试一下Record中的equal方法。会发现只要属性相同,结果是相同的。
public class TestRecord {public static void main(String[] args) {RecordExample example1 = new RecordExample(1l, "name1");RecordExample example2 = new RecordExample(1l, "name1");System.out.println(example1.equals(example2));}
}
6. 优化了空指针异常
1)、说明
Java15新特性,就是把NullPointerException异常的日志做了优化打印的更人性化。
2)、案例
可以看到,提示会更有指向性,意味着以后在复杂的生产环境排错过程中,你很可能不会再被空指针异常所困扰。
public class TestNPE {public static void main(String[] args) {User user = new User();user.getUserName().toLowerCase();}
}
运行之后的错误信息,可以很容易定位到哪里为null.
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because the return value of "com.sealed.example.User.getUserName()" is null
at com.sealed.example.TestNPE.main(TestNPE.java:8)
6. ZGC垃圾收集器
jdk11就有了 , jdk15 已经正式转正, jdk17 zgc已经很成熟了。
ZGC的优点是,垃圾回收不卡顿。也就是说没有了STW- stop the world. 卡的时间是小于10ms.
堆内存可以设置很大,甚至可以是T级别。
ZGC 高吞吐。
ZGC 低延迟
很小的 pause time.
更少的额外资源利用。
GC progress from JDK 8 to JDK 17