java14新特性

新特性一、简化instanceof

//以前的写法
public class Feature01 {
     
    @Test
    public void test1(){
     

        Object obj = new String("hello,Java14");
        obj = null;//在使用null 匹配instanceof 时,返回都是false.
        if(obj instanceof String){
     
            String str = (String) obj;
            System.out.println(str.contains("Java"));
        }else{
     
            System.out.println("非String类型");
        }

        //举例1:新特性的写法一
        if(obj instanceof String str){
      //新特性:省去了强制类型转换的过程
            System.out.println(str.contains("Java"));
        }else{
     
            System.out.println("非String类型");
        }
    }
}


class InstanceOf{
     

    String str = "abc";

    public void test(Object obj){
     
		// 新特性的写法二
        if(obj instanceof String str){
     //此时的str的作用域仅限于if结构内。
            System.out.println(str.toUpperCase());
        }else{
     
            System.out.println(str.toLowerCase());
        }

    }

}

//举例3:
class Monitor{
     
    private String model;
    private double price;

//    public boolean equals(Object o){
     
//        if(o instanceof Monitor other){
     
//            if(model.equals(other.model) && price == other.price){
     
//                return true;
//            }
//        }
//        return false;
//    }


    public boolean equals(Object o){
     
        return o instanceof Monitor other && model.equals(other.model) && price == other.price;
    }

}

新特性二、改进NullPointerException

jdk14中这个新特性能够告诉你到底是那个方法导致空指针异常,而再jdk14以前则只会告诉你哪一行代码报空指针异常。如果遇到链式调用的代码则不能确定到底是那个环节导致了异常

再程序运行的时候需要添加一行参数:-XX:+ShowCodeDetailsInExceptionMessages
可能后期版本中就会将其作为默认参数,但再java14中需要添加这个参数才能使用这个新特性

新特性三、Rocord (预览特性、后期版本一定会被确定下来)

record的出现是为了解决java啰嗦的用来作为数据的承载类(entity层),例如get、set、toString等方法
如下定义代码

public record User(String name,Integer age) {
     
}

编译后就是

public final class User extends java.lang.Record {
     
    private final java.lang.String name;
    private final java.lang.Integer age;

    public User(java.lang.String name, java.lang.Integer age) {
      /* compiled code */ }

    public java.lang.String toString() {
      /* compiled code */ }

    public final int hashCode() {
      /* compiled code */ }

    public final boolean equals(java.lang.Object o) {
      /* compiled code */ }

    public java.lang.String name() {
      /* compiled code */ }

    public java.lang.Integer age() {
      /* compiled code */ }
}

成员属性是final的只有get方法,与以前的不同采用变量名作为get方法的方法名
如下示例代码

public static void main(String[] args) throws IOException {
     
    User user = new User("张三", 14);
    System.out.println(user.name()); //相当于getName获取到了name字段
    System.out.println(user.age());//相当于getAge获取到了age字段
    System.out.println(user);//打印输出: User[name=张三, age=14]
}

java14新特性_第1张图片

record注意点

record可以定义静态的属性、静态的方法、构造方法、实例方法

  1. 如果声明非静态的属性则会报语法错误
public record Person(String name,Person partner) {
     
    //不可以声明非静态的属性
    private int id;//报错
}
  1. 不可以将record定义的类声明为abstract的
    下面的定义不符合语法
abstract record Order(){
      //报错

}
  1. 不可以给record定义的类声明显式的父类(非Record类)下面的定义不符合语法
record Order() extends Thread{
      //报错

}

新特性四、弃用ParallelScavenge (Young区的GC)与

SerialOld GC (Old区的GC)组合作为GC

这个组合的使用场景是拥有一个很大的Young区和一个很小的Old区

废弃了parallel young generation GC与SerialOld GC的组合( -XX:+UseParallelGC与XX:-UseParallelOldGC配合开启),现在使用-XX:+UseParallelGC -XX:UseParallelOldGC或者-XX:-UseParallelOldGC都会出现告警如下

Java HotSpot(TM) 64-Bit Server VM warning: Option UseParallelOldGC was deprecated in version 14.0 and will likely be removed in a future release.

新特性五、直接删除CMS垃圾回收器,在Jdk9时就已经标记为废除

CMS的弊端 :

  1. 会产生内存碎片,导致并发清除后,用户线程可用的空间不足。
  2. 既然强调了并发(Concurrent),CMS收集器对CPU资源非常敏感
  3. CMS 收集器无法处理浮动垃圾(一边回收、另一边产生垃圾称为浮动垃圾)

新特性六、ZGC(未来的垃圾回收器,STW在10ms以内)

使用方式

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

你可能感兴趣的:(#,java14新特性)