java14新特性


不知不覺Java14已於3月17發布正式版,雖然我們大部分人還在用Java8,但是作為Java程序員還是有必要了解一下Java的發展趨勢以及新的變化。雖然Java14不是LTS版本,但新的特性應該會延續到后續版本中。

語法層面新特性

一、instanceof的模式匹配

  使用instanceof關鍵字來判斷對象的真實類型,可以不用強制轉換了,從而減少冗余的代碼

Object o = new Person("Tom", "18");
    
//老的方式
if(o instanceof Person) {
    Person p = (Person) o;
    System.out.println(p);
}
        
//java14實現方式
if(o instanceof Person p) {
    System.out.println(p);
}
public boolean test(Person person) {
    Object obj = new Person("Tom", "18");
    return obj instanceof Person p && person.equals(obj);
}

二、switch表達式

Java8中switch支持的類型有:byte char short int Byte Short Character Integer String  enum

Java12中支持返回值和 ->語法,Java13支持yield返回值,這兩個版本只是預覽版,Java14中正式發布switch表達式特性

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(1);
    case TUESDAY                -> System.out.println(2);
    case THURSDAY, SATURDAY     -> System.out.println(3);
    case WEDNESDAY              -> System.out.println(4);
}

//返回值
int i = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 1;
    case TUESDAY                -> 2;
    case THURSDAY, SATURDAY     -> 3;
    case WEDNESDAY              -> 4;
};

//使用yield返回值
int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        System.out.println("default");
        yield 2;
    }
};

、文本塊

類似於Python和Groovy,方便編寫多行的字符串字面量。

Java13中已引入作為預覽特性,Java 14中做了改進,引入了兩個新的轉義序列。可以使用 \s 轉義序列來表示一個空格,可以使用反斜杠 \ 來避免在行尾插入換行字符。

String text = """
    select t.* from test t \
    where t.a = 1 and t.b = 1\s\
    and exist (\s\
    select 1 from test1 t2 where t2.a = t.a and t2.b = t.b\s\
    )
""";
System.out.println(text);

 四、record

類似於Lombok的@Data注解,用於減少固定的模板代碼。和枚舉類型一樣,記錄也是類的一種受限形式,只用於存儲數據,沒有其它自定義的行為。

public record Person(String name, int age) {
    public static String address;
    
    public String getName() {
        return name;
    }
}

//反編譯結果
public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final java.lang.String age;
    public static int a;

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

    public java.lang.String getName() { /* 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.String age() { /* compiled code */ }
}

1、record只能作用於類,且該類為final修飾,不能被繼承。屬性都是final修飾的,不能再被賦值,不能完全代替JavaBeans使用。

2、繼承了java.lang.Record,不可以在繼承其它類。

3、可以定義靜態屬性、靜態或實例方法、構造函數。

五、NullPointerException 錯誤推斷

虛擬機參數里面加上-XX:+ShowCodeDetailsInExceptionMessages,可以顯示空指針發生時顯示明確的診斷信息,有助於查找問題

 

JVM層面新特性

一、刪除CMS垃圾收集器

CMS用於老年代垃圾收集,使用的是標記清除算法。

會產生內存碎片,導致無法提供連續的分配空間分配大對象。無法處理浮動垃圾,並發收集對CPU資源比較敏感。

二、棄用ParallelScavenge + SerialOld GC組合

三、macOS和Windos上支持ZGC

四、針對G1的NUMA感知內存分配

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM