不知不覺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感知內存分配
