在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");
}
}
jdk15,提供了一个文本块的特性,可以直接三个双引号。
jdk17的时候提供两个字符, \是用于将两行连接为一行,\s允许前面加空格。
jdk14 预览版,jdk16, jdk17 对 instanceof增强了。
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{
}
优点: 更安全,可控,易维护。
类似于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));
}
}
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)
jdk11就有了 , jdk15 已经正式转正, jdk17 zgc已经很成熟了。
ZGC的优点是,垃圾回收不卡顿。也就是说没有了STW- stop the world. 卡的时间是小于10ms.
堆内存可以设置很大,甚至可以是T级别。
ZGC 高吞吐。
ZGC 低延迟
GC progress from JDK 8 to JDK 17