新特性一、简化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新特性_新特性

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