Java的發展:從Java0到Java14的新特性

在這裏插入圖片描述

Java0

1996 年 1 月Sun公司發佈第一個正式的Java版本,JDK1.0

Java1

1997 年 2 月Sun 公司發佈 JDK1.1

  1. 重新編寫了用於桌面軟件開發的 AWT 庫(因爲上個版本的 AWT 是 Java 最弱的組件,之前的庫對於不同操作系統的界面抽象太簡單,各個平臺並不能兼容,這也不符合 Java 承諾的 “write once,run anywhere”)
  2. 加入了內部類
  3. 支持 JavaBeans ,使得 Java 對象可以被序列化成二進制
  4. JDBC,讓 Java 可以連數據庫,不過還需要數據庫開發自家的數據庫驅動纔可以。
  5. RMI 遠程方法調用,本地代碼調用不在本地的方法,但需要遵守相關的通信協議。
  6. 支持不能在代碼運行時修改的反射
  7. Symantec 公司爲 Java 開發編寫的即時編譯器(提前編譯代碼,增強代碼真正執行時的性能)
  8. 支持國際化和Unicode編碼

Java2

1998 年 12 月公司發佈 J2SE1.2
1999年,Sun 公司發佈了三個版本的 Java,標準版(J2SE,後來改名爲 JavaSE)、企業版(J2EE,後來改名爲 JavaEE)、微型版(J2ME,後來改名爲 JavaME)

  1. strictfp 關鍵字,可以保證在不同平臺上的浮點數計算都是一樣的
  2. Swing 組件,可以看作是 AWT 增強版的桌面軟件開發庫
  3. Sun 公司自己開發的即時編譯器
  4. Java plug-in,Java 相關的插件,如支持 Applet 程序的瀏覽器插件
  5. Java IDL,爲 Java 和其他語言互通打下基礎
  6. Collections 框架,Java 中複雜的數據類型

Java3

2000 年 5 月Sun 公司發佈 J2SE1.3

  1. Sun 公開的 HotSpot JVM,經典的 Java 虛擬機
  2. 爲遵循 CORVA 標準而修改了 RMI
  3. **Java Platform Debugger Architecture,**用於 Java 調式的平臺
  4. JavaSound API,編寫音頻處理的函數庫
  5. Synthetic proxy,Java 代理的基礎

Java4

2002 年 2 月Sun 公司發佈了在 JCP(Java Community Process) 的標準下開發的J2SE1.4

  1. 支持正則表達式
  2. assert 關鍵字,寫測試代碼用
  3. 異常鏈,低級異常包裝後再拋出,也方便開發人員調試
  4. 支持網絡 IPV6 標準
  5. NIO,非阻塞的 IO,優化 Java 的 IO 讀取
  6. 日誌 API
  7. XML 解析器和 XSLT 轉換器
  8. 集成安全和加密擴展組件(JCE, JSSE, JAAS)
  9. Java Web Start 技術,直接從瀏覽器中啓動 Java 平臺
  10. Preference API,在 java.util.prefs 包下

Java5

2004 年 9 月Sun 公司發佈 J2SE5
  1. 泛型 (Generics)
 List<Integer> list=new ArrayList<Integer>();
  1. 增強for循環(Enhanced for Loop)
 int[] array = {1, 2, 3, 4, 5};
 for (int i : array) {
    System.out.println(i);
 } 
  1. 自動封箱拆箱(Autoboxing/Unboxing )。八大基本類型和它們的包裝類能夠自動的相互轉換。
  2. 枚舉(Typesafe Enums)。枚舉是一種實現線程安全的單例模式的好方式。
 enum TestEnum{
        one,
        two;
        TestEnum() {
        }
    }
  1. 可變參數 (Varargs)。可變參數本質仍然是用一個數組存儲參數,只是java隱藏了這一過程。需要注意的是如果一個方法聲明中含有可變參數,那必須放在最後一個位置。
    //可變參數測試
    public static void testVarargs(String... args) {
        //本質就是個數組
        System.out.println(args[1]);
        for (String arg : args) {
            System.out.println(arg);
        }
    }
  1. 靜態導入(Static Import)。通過import類來使用類裏的靜態變量或方法(直接通過名字,不需要加上類名.),簡化了代碼的書寫。
//單個導入
import static java.lang.Math.PI;
//批量導入
import static java.lang.Math.*;
  1. 註解(Annotations)
//註釋註解的註解又叫做元註解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotations {
    //註解內可以添加方法,也可以不添加
    //註解方法的返回值只能是基本類型,String,Class類,枚舉,註解,可以有默認值。
    int id();
    String name() default "whh";
    Class classType();
    TestEnum enumType();
}
  1. 改進了 Java 的內存模型,提供了 java.util.concurrent 併發包。
  2. Metadata,元數據,描述數據的數據

Java6

2006 年 12 月Sun 公司發佈 JavaSE6

  1. 集合框架增強,下面爲新添加的接口和類
    Deque
    BlockingDeque
    NavigableSet
    NavigableMap
    ConcurrentNavigableMap
    ArrayDeque
    ConcurrentSkipListSet
    ConcurrentSkipListMap
    ConcurrentSkipListMap
    AbstractMap.SimpleEntry
    AbstractMap.SimpleImmutableEntry
  2. Scripting. 可以讓其他語言在java平臺上運行。 java6包含了一個基於Mozilla Rhino實現的javascript腳本引擎
  3. 支持JDBC4.0規範
  4. 提供動態語言支持
  5. 提供編譯 API,即 Java 程序可以調用 Java 編譯器的 API
  6. Swing 庫的一些改進
  7. JVM 的優化
  8. 微型 HTTP 服務器 API

Java7

2011 年 7 月,Oracle收購Sun 公司,發佈 JavaSE7

  1. 二進制前綴0b或者0B。整型(byte, short, int, long)可以直接用二進制表示。
  //二進制字面值前綴0b 或0B
    int i = 0b010;//10進制值爲2
    int j = 0B010;
  1. 字面常量數字的下劃線。用下劃線連接整數提升其可讀性,自身無含義,不可用在數字的起始和末尾。
    //數字間的下劃線不影響實際值
     int k = 1_1;//值爲11
  1. switch 支持String類型
  2. 泛型實例化類型自動推斷
Map<String, List<String>> myMap = new HashMap<String, List<String>>();    // 之前
Map<String, List<String>> myMap = new HashMap<>();        // 現在
  1. try-with-resources語句
       /*
         * 聲明在try括號中的對象稱爲資源,在方法執行完畢後會被自動關閉,相對與之前必須在finally關閉資源,這一特性大大提高了代碼的簡潔性。
         * 所有實現java.lang.AutoCloseable接口的類都作爲資源被自動關閉。
        */
       try (BufferedReader reader=new BufferedReader(new FileReader("d:1.txt"))){
          return reader.readLine();
      }
  1. 單個catch中捕獲多個異常類型(用| 分割)並通過改進的類型檢查重新拋出異常
  2. 簡化了可變參數的使用
  3. 支持二進制整數
  4. NIO 庫的一些改進,增加多重文件的支持、文件原始數據和符號鏈接

Java8

2014 年 3 月,Java SE 8 (LTS)發佈

  1. Lambda 表達式:Lambda 允許把函數作爲一個方法的參數(函數作爲參數傳遞到方法中)。
  2. 方法引用:直接引用已有Java類或對象(實例)的方法或構造器。
  3. 默認方法:在接口裏面有了一個實現的方法。
  4. 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。
  5. Stream API(java.util.stream) :把真正的函數式編程風格引入到Java中。
  6. Date Time API:加強對日期與時間的處理。
  7. Optional 類:成爲 Java 8 類庫的一部分,用來解決空指針異常。
  8. Nashorn JavaScript 引擎:在JVM上運行特定的javascript應用。
  9. 重複註解(Repeating Annotations):提供了在同一聲明或類型中多次應用相同註解類型的能力。
  10. 類型註解(Type Annotation):在任何地方都能使用註解,而不是在聲明的地方。
  11. 類型推斷增強。
  12. 方法參數反射(Method Parameter Reflection)
  13. HashMap改進,在鍵值哈希衝突時能有更好表現
  14. java.util 包下的改進,添加了幾個實用的工具類:並行數組排序,標準的Base64編解碼,支持無符號運算。
  15. java.util.concurrent 包下增加了新的類和方法
    java.util.concurrent.ConcurrentHashMap類添加了新的方法以支持新的StreamApi和lambada表達式。
    java.util.concurrent.atomic 包下新增了類以支持可伸縮可更新的變量。
    java.util.concurrent.ForkJoinPool類新增了方法以支持 common pool。
    新增了java.util.concurrent.locks.StampedLock類,爲控制讀/寫訪問提供了一個基於性能的鎖,且有三種模式可供選擇。
  16. HotSpot刪除了 永久代(PermGen),方法調用的字節碼指令支持默認方法
  17. 靜態鏈接 JNI 程序庫

Java9

2017 年 9 月,Oracle 發佈 JavaSE9

1.java模塊系統 (Project Jigsaw)(Java Platform Module System)

JDK 被重新組織成 94 個模塊,可以通過新增的 jlink 工具,創建出只包含所依賴的 JDK 模塊的自定義運行時鏡像,極大地減少 Java 運行時環境的大小。
Java 9 模塊的重要特徵是在其工件(artifact)的根目錄中包含了一個描述模塊的 module-info.class 文件。工件的格式可以是傳統的 JAR 文件或是 Java 9 新增的 JMOD 文件。

2.集合、Stream 和 Optional

  • 增加 了 List.of()、Set.of()、Map.of() 和Map.ofEntries()等工廠方法來創建不可變集合,比如List.of(“Java”, “C++”);、Map.of(“Java”,1, “C++”, 2);
  • Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate方法。
  • Collectors 中增加了新的方法 filtering 和 flatMapping。
  • Optional 類中新增了 ifPresentOrElse、or 和 stream 等方法。

3.平臺日誌 API 和服務

Java 9 允許爲 JDK 和應用配置同樣的日誌實現。新增了 System.LoggerFinder 用來管理 JDK 使 用的日誌記錄器實現。JVM 在運行時只有一個系統範圍的 LoggerFinder 實例。
我們可以通過添加自己的 System.LoggerFinder 實現來讓 JDK 和應用使用 SLF4J 等其他日誌記錄框架。

4.反應式流 ( Reactive Streams )

  • 在 Java9 中的 java.util.concurrent.Flow 類中新增了反應式流規範的核心接口
  • Flow 中包含了 Flow.Publisher、Flow.Subscriber、Flow.Subscription 和Flow.Processor 等 4 個核心接口。Java 9 還提供了SubmissionPublisher作爲Flow.Publisher 的一個實現。

5.變量句柄

  • 變量句柄是一個變量或一組變量的引用,包括靜態域,非靜態域,數組元素和堆外數據結構中的組成部分等
  • 變量句柄的含義類似於已有的方法句柄MethodHandle
  • 由 Java 類java.lang.invoke.VarHandle 來表示,可以使用類java.lang.invoke.MethodHandles.Lookup 中的靜態工廠方法來創建 VarHandle 對象

6.改進方法句柄(Method Handle)

方法句柄從 Java7 開始引入,Java9 在類java.lang.invoke.MethodHandles 中新增了更多的靜態方法來創建不同類型的方法句柄

7. Javadoc

簡化Doclet API。
支持生成HTML5格式。
加入了搜索框,使用這個搜索框可以查詢程序元素、標記的單詞和文檔中的短語。
支持新的模塊系統。

8. JVM

增強了Garbage-First(G1)並用它替代Parallel GC成爲默認的垃圾收集器。
統一了JVM 日誌,爲所有組件引入了同一個日誌系統。
刪除了JDK 8中棄用的GC組合。(DefNew + CMS,ParNew + SerialOld,Incremental CMS)。

其他新特性

  1. 新的版本號格式。$MAJOR.$MINOR.$SECURITY.$PATCH
  2. java shell,交互式命令行控制檯。
  3. private instance methods方法上可以使用@SafeVarargs註解
  4. diamond語法與匿名內部類結合使用
  5. 下劃線_不能單獨作爲變量名使用
  6. 支持私有接口方法(可以使用diamond語法與匿名內部類結合使用)
  7. properties文件支持UTF-8編碼,之前只支持ISO-8859-1。支持Unicode 8.0,在JDK8中是Unicode 6.2。
  8. 增加了 ProcessHandle 接口,可以對原生進程進行管理,尤其適合於管理長時間運行的進程
  9. 即時編譯功能的增強
  10. XML Catalogs ,XML 文件自動校驗

Java10

2018 年 3 月,Oracle 發佈Java SE 10

1. var關鍵字(局部變量類型推斷)(Local-Variable Type Inference)

//之前的代碼格式
URL url = new URL("http://www.oracle.com/"); 
URLConnection conn = url.openConnection(); 
Reader reader = new BufferedReader(
    new InputStreamReader(conn.getInputStream()))
//java10中用var來聲明變量
var url = new URL("http://www.oracle.com/"); 
var conn = url.openConnection(); 
var reader = new BufferedReader(
    new InputStreamReader(conn.getInputStream()));

2. Optional類添加了新的方法orElseThrow(無參數版)

3. java.util.stream.Collectors中新增了靜態方法,用於將流中的元素收集爲不可變的集合

4.並行全垃圾回收器 G1

G1 是以一種低延時的垃圾回收器來設計的,旨在避免進行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用單線程去完成標記清除算法,這可能會導致垃圾回收期在無法回收內存的時候觸發 Full GC。
爲了最大限度地減少 Full GC 造成的應用停頓的影響,從 Java10 開始,G1 的 FullGC 改爲並行的標記清除算法,同時會使用與年輕代回收和混合回收相同的並行工作線程數量,從而減少了 Full GC 的發生,以帶來更好的性能提升、更大的吞吐量。

5.應用程序類數據共享

在 Java 5 中就已經引入了類數據共享機制 (Class Data Sharing,簡稱 CDS),允許將一組類預處理爲共享歸檔文件,以便在運行時能夠進行內存映射以減少 Java 程序的啓動時間,當多個 Java 虛擬機(JVM)共享相同的歸檔文件時,還可以減少動態內存的佔用量,同時減少多個虛擬機在同一個物理或虛擬的機器上運行時的資源佔用。

Java 10 在現有的 CDS 功能基礎上再次拓展,以允許應用類放置在共享存檔中。CDS 特性在原來的 bootstrap 類基礎之上,擴展加入了應用類的 CDS (Application Class-Data Sharing) 支持。其原理爲:在啓動時記錄加載類的過程,寫入到文本文件中,再次啓動時直接讀取此啓動文本並加載。設想如果應用環境沒有大的變化,啓動速度就會得到提升。

其他新特性

  1. 線程-局部管控:Java 10 中線程管控引入 JVM 安全點的概念,將允許在不運行全局 JVM 安全點的情況下實現線程回調,由線程本身或者 JVM 線程來執行,同時保持線程處於阻塞狀態,這種方式使得停止單個線程變成可能,而不是隻能啓用或停止所有線程

  2. 備用存儲裝置上的堆分配:Java 10 中將使得 JVM 能夠使用適用於不同類型的存儲機制的堆,在可選內存設備上進行堆內存分配

  3. 統一的垃圾回收接口:Java 10 中,hotspot/gc 代碼實現方面,引入一個乾淨的 GC 接口,改進不同 GC 源代碼的隔離性,多個 GC 之間共享的實現細節代碼應該存在於輔助類中。統一垃圾回收接口的主要原因是:讓垃圾回收器(GC)這部分代碼更加整潔,便於新人上手開發,便於後續排查相關問題。

Java11

2018 年 9 月,發佈Java SE 11 (LTS)

1. 增加一系列字符串處理方法

//判斷字符串是否爲空
" ".isBlank();//true
//去除字符串首尾空格
" Java ".strip();// "Java" 
//去除字符串首部空格
" Java ".stripLeading();   // "Java "  
//去除字符串尾部空格
" Java ".stripTrailing();  // " Java"  
//重複字符串多少次
"Java".repeat(3);             // "JavaJavaJava"  

//返回由行終止符分隔的字符串集合。
"A\nB\nC".lines().count();    // 3 
"A\nB\nC".lines().collect(Collectors.toList()); 

2.ZGC:可伸縮低延遲垃圾收集器

ZGC 即 Z Garbage Collector,是一個可伸縮的、低延遲的垃圾收集器,主要爲了滿足如下目標進行設計:

  • GC 停頓時間不超過 10ms
  • 即能處理幾百 MB 的小堆,也能處理幾個 TB 的大堆
  • 應用吞吐能力不會下降超過 15%(與 G1 回收算法相比)
  • 方便在此基礎上引入新的 GC 特性和利用 colord
  • 針以及 Load barriers 優化奠定基礎

ZGC 目前 處在實驗階段,只支持 Linux/x64 平臺

3.標準 HTTP Client 升級

Java 11 對 Java 9 中引入並在 Java 10 中進行了更新的 Http Client API 進行了標準化,在前兩個版本中進行孵化的同時,Http Client 幾乎被完全重寫,並且現在完全支持異步非阻塞。
並且,Java11 中,Http Client 的包名由 jdk.incubator.http 改爲java.net.http,該 API 通過 CompleteableFuture 提供非阻塞請求和響應語義。

var request = HttpRequest.newBuilder()  
    .uri(URI.create("https://javastack.cn"))  
    .GET()  
    .build();  
var client = HttpClient.newHttpClient();  
// 同步  
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());  
System.out.println(response.body());  
// 異步  
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())  
    .thenApply(HttpResponse::body)  
    .thenAccept(System.out::println); 

4.簡化啓動單個源代碼文件的方法

  • 增強了 Java 啓動器,使其能夠運行單一文件的 Java 源代碼。此功能允許使用 Java 解釋器直接執行 Java源代碼。源代碼在內存中編譯,然後由解釋器執行。唯一的約束在於所有相關的類必須定義在同一個 Java 文件中
  • 對於 Java 初學者並希望嘗試簡單程序的人特別有用,並且能和 jshell 一起使用
  • 一定能程度上增強了使用 Java 來寫腳本程序的能力

5.用於 Lambda 參數的局部變量語法

從 Java 10 開始,便引入了局部變量類型推斷這一關鍵特性。類型推斷允許使用關鍵字 var作爲局部變量的類型而不是實際類型,編譯器根據分配給變量的值推斷出類型。Java 10 中對 var 關鍵字存在幾個限制:

  • 只能用於局部變量上
  • 聲明時必須初始化
  • 不能用作方法參數
  • 不能在 Lambda 表達式中使用

Java11 開始允許開發者在 Lambda 表達式中使用 var 進行參數聲明

其他新特性

  • 支持Unicode 10.0,在jdk10中是8.0
  • 編譯器線程的延遲分配。添加了新的命令-XX:+UseDynamicNumberOfCompilerThreads動態控制編譯器線程的數量。
  • Epsilon。一款新的實驗性無操作垃圾收集器。Epsilon GC 只負責內存分配,不實現任何內存回收機制。這對於性能測試非常有用,可用於與其他GC對比成本和收益。
  • 低開銷的 Heap Profiling:Java 11 中提供一種低開銷的 Java 堆分配採樣方法,能夠得到堆分配的 Java 對象信息,並且能夠通過 JVMTI 訪問堆信息
  • TLS1.3 協議:Java 11 中包含了傳輸層安全性(TLS)1.3 規範(RFC 8446)的實現,替換了之前版本中包含的 TLS,包括 TLS 1.2,同時還改進了其他 TLS 功能,例如 OCSP 裝訂擴展(RFC 6066,RFC 6961),以及會話散列和擴展主密鑰擴展(RFC 7627),在安全性和性能方面也做了很多提升
  • 飛行記錄器:商業版 JDK 的一項分析工具,但在 Java 11 中,其代碼被包含到公開代碼庫中,這樣所有人都能使用該功能了

Java12

2019 年 3 月,發佈Java SE 12

1.增強 Switch

傳統的 switch 語法存在容易漏寫 break 的問題,而且從代碼整潔性層面來看,多個 break 本質也是一種重複。
Java12 提供了 swtich 表達式,使用類似 lambda 語法條件匹配成功後的執行塊,不需要多寫 break。
作爲預覽特性加入,需要在javac編譯和java運行時增加參數–enable-preview。

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

2. 數字格式化工具類NumberFormat新增了對複雜的數字進行格式化的支持

NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
String result = fmt.format(1000);
 System.out.println(result); // 輸出爲 1K,計算工資是多少K更方便了。。。

3.Shenandoah GC

Redhat 主導開發的 Pauseless GC 實現,主要目標是 99.9% 的暫停小於 10ms,暫停與堆大小無關等
和 Java11 開源的 ZGC 相比(需要升級到 JDK11 才能使用),Shenandoah GC 有穩定的 JDK8u 版本,在 Java8 佔據主要市場份額的今天有更大的可落地性

4.G1 收集器提升

  • 可中止的混合收集集合:JEP344 的實現,爲了達到用戶提供的停頓時間目標,JEP 344通過把要被回收的區域集(混合收集集合)拆分爲強制和可選部分,使 G1 垃圾回收器能中止垃圾回收過程。G1可以中止可選部分的回收以達到停頓時間目標。
  • 及時返回未使用的已分配內存:JEP346 的實現,增強 G1 GC,以便在空閒時自動將 Java 堆內存返回給操作系統。

Java13

2019 年 9 月,發佈Java SE 13

1.引入 yield 關鍵字到 Switch 中

這個關鍵字 yield是用於返回一個值的。
與return 的區別在於:return 會直接跳出當前循環或者方法,而 yield 只會跳出當前 Switch 塊,同時在使用 yield 時,需要有 default 條件

private static String descLanguage(String name) {
        return switch (name) {
            case "Java": yield "object-oriented, platform independent and secured";
            case "Ruby": yield "a programmer's best friend";
            default: yield name +" is a good language";
        };
 }

2.文本塊

解決 Java 定義多行字符串時只能通過換行轉義或者換行連接符來變通支持的問題,引入三重雙引號來定義多行文本
兩個"""中間的任何內容都會被解釋爲字符串的一部分,包括換行符

String json ="{\n" +
              "   \"name\":\"mkyong\",\n" +
              "   \"age\":38\n" +
              "}\n";   // 未支持文本塊之前
String json = """
                {
                    "name":"mkyong",
                    "age":38
                }
                """;

3.增強 ZGC 釋放未使用內存

  • ZGC存在未能主動將未使用的內存釋放給操作系統的問題
  • ZGC 堆由一組稱爲 ZPages 的堆區域組成。在 GC 週期中清空 ZPages 區域時,它們將被釋放並返回到頁面緩存ZPageCache 中,此緩存中的 ZPages 按最近最少使用(LRU)的順序,並按照大小進行組織
  • ZGC將向操作系統返回被標識爲長時間未使用的頁面,這樣它們將可以被其他進程重用

4.SocketAPI 重構

爲 Socket API 帶來了新的底層實現方法,並默認使用新的 Socket 實現,使其易於發現並在排除問題同時增加可維護性

5.動態應用程序類-數據共享

允許在 Java 應用程序執行結束時動態進行類歸檔,具體能夠被歸檔的類包括:所有已被加載,但不屬於默認基層 CDS 的應用程序類和引用類庫中的類

Java14

2020 年 3 月,發佈Java SE 14

1.record 關鍵字

  • 簡化數據類的定義方式,使用 record 代替 class 定義的類,只需要聲明屬性,就可以在獲得屬性的訪問方法,以及toString,hashCode,equals 方法
  • 類似於使用 Class 定義類,同時使用了 lomobok插件,並打上了@Getter,@ToString,@EqualsAndHashCode註解
  • 作爲預覽特性引入
/**
 * 這個類具有兩個特徵
 * 1. 所有成員屬性都是final
 * 2. 全部方法由構造方法,和兩個成員屬性訪問器組成(共三個)
 * 那麼這種類就很適合使用record來聲明
 */
final class Rectangle implements Shape {
    final double length;
    final double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    double length() { return length; }
    double width() { return width; }
}
/**
 * 1. 使用record聲明的類會自動擁有上面類中的三個方法
 * 2. 在這基礎上還附贈了equals(),hashCode()方法以及toString()方法
 * 3. toString方法中包括所有成員屬性的字符串表示形式及其名稱
 */
record Rectangle(float length, float width) { }

2.空指針異常精準提示

通過 JVM 參數中添加-XX:+ShowCodeDetailsInExceptionMessages,可以在空指針異常中獲取更爲詳細的調用信息,更快的定位和解決問題

a.b.c.i = 99; // 假設這段代碼會發生空指針

Exception in thread "main" java.lang.NullPointerException:
        Cannot read field 'c' because 'a.b' is null.
    at Prog.main(Prog.java:5) // 增加參數後提示的異常中很明確的告知了哪裏爲空導致

3.switch 的增強終於轉正

JDK12 引入的 switch(預覽特性)在 JDK14 變爲正式版本,不需要增加參數來啓用,直接在 JDK14 中就能使用
主要是用->來替代以前的:+break;另外就是提供了 yield 來在 block 中返回值

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

4.instanceof 增強

可以在判斷的是否屬於具體的類型同時完成轉換

Object obj = "我是字符串";
if(obj instanceof String str){
 System.out.println(str);
}

5.其他特性

  • 從 Java11 引入的 ZGC 作爲繼 G1 過後的下一代 GC 算法,從支持 Linux 平臺到 Java14 開始支持 MacOS和 Window
  • 移除了 CMS 垃圾收集器(功成而退)
  • 新增了 jpackage 工具,標配將應用打成 jar 包外,還支持不同平臺的特性包,比如 linux 下的deb和rpm,window平臺下的msi和exe

歡迎關注我的公衆號

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章