新特性一、简化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]
}
record注意点
record可以定义静态的属性、静态的方法、构造方法、实例方法
- 如果声明非静态的属性则会报语法错误
public record Person(String name,Person partner) {
//不可以声明非静态的属性
private int id;//报错
}
- 不可以将record定义的类声明为abstract的
下面的定义不符合语法
abstract record Order(){ //报错
}
- 不可以给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的弊端 :
- 会产生内存碎片,导致并发清除后,用户线程可用的空间不足。
- 既然强调了并发(Concurrent),CMS收集器对CPU资源非常敏感
- CMS 收集器无法处理浮动垃圾(一边回收、另一边产生垃圾称为浮动垃圾)
新特性六、ZGC(未来的垃圾回收器,STW在10ms以内)
使用方式
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC