Java 9 ← 2017,2019 Java → 13 ,都發生了什麼?

距離 2019 年結束,只剩下 30 幾天了。你作好準備迎接 2020 年了嗎?html

一到年末,人就特別容易陷入回憶和比較之中,好比說這幾天, 的對比挑戰就火了!java

這個話題登上了微博的熱搜榜,也刷爆了朋友圈,人們紛紛曬出本身2017和2019的照片對比。算法

做爲一個技術宅,我也作了一個對比:express

2017 年 9 月 21 日,Java 9 正式發佈,而且在2017年8月,JCP執行委員會提出將Java的發佈頻率改成每六個月一次,新的發佈週期嚴格遵循時間點,將在每一年的3月份和9月份發佈。編程

歷任JDK對比

Java 9 於 2017 年 9 月 22 日正式發佈,帶來了不少新特性,其中最主要的變化是已經實現的模塊化系統。安全

主要特性:服務器

  • 模塊系統:模塊是一個包的容器,Java 9 最大的變化之一是引入了模塊系統(Jigsaw 項目)。
  • HTTP 2 客戶端:HTTP/2標準是HTTP協議的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服務器推送特性。
  • 改進的 Javadoc:Javadoc 如今支持在 API 文檔中的進行搜索。另外,Javadoc 的輸出如今符合兼容 HTML5 標準。
  • 集合工廠方法:List,Set 和 Map 接口中,新的靜態工廠方法能夠建立這些集合的不可變實例。
  • 私有接口方法:在接口中使用private私有方法。咱們可使用 private 訪問修飾符在接口中編寫私有方法。
  • 改進的 Stream API:改進的 Stream API 添加了一些便利的方法,使流處理更容易,並使用收集器編寫複雜的查詢。
  • 改進 try-with-resources:若是你已經有一個資源是 final 或等效於 final 變量,您能夠在 try-with-resources 語句中使用該變量,而無需在 try-with-resources 語句中聲明一個新變量。
  • 改進的棄用註解 @Deprecated:註解 @Deprecated 能夠標記 Java API 狀態,能夠表示被標記的 API 將會被移除,或者已經破壞。
  • 改進 Optional 類:java.util.Optional 添加了不少新的有用方法,Optional 能夠直接轉爲 stream。
  • 響應式流(Reactive Streams) API: Java 9中引入了新的響應式流 API 來支持 Java 9 中的響應式編程。

Java 10 於 2018 年3 月21 日正式發佈,這是做爲當今使用最普遍的編程語言之一的Java 語言的第十個大版本。編程語言

主要特性:模塊化

  • 局部變量類型推斷(Local-Variable Type Inference):使用var關鍵字進行變量聲明,能夠進行變量類型的推斷。
  • G1的並行Full GC(Parallel Full GC for G1):G1 垃圾回收器的並行完整垃圾回收,實現並行性來改善最壞狀況下的延遲。
  • 應用程序類數據共享(Application Class-Data Sharing):應用程序類數據 (AppCDS) 共享,經過跨進程共享通用類元數據來減小內存佔用空間,和減小啓動時間。
  • ThreadLocal握手機制(Thread-Local Handshakes):在不進入到全局 JVM 安全點 (Safepoint) 的狀況下,對線程執行回調。優化能夠只中止單個線程,而不是停所有線程或一個都不停。

Java 11 於 2018 年9 月25 日正式發佈,可在生產環境中使用!這是自 Java 8 後的首個長期支持版本,將支持到2026年。函數式編程

主要特性:

  • ZGC,可擴展的低延遲垃圾收集器(ZGC: A Scalable Low-Latency Garbage Collector):ZGC是一款號稱能夠保證每次GC的停頓時間不超過10MS的垃圾回收器,而且和當前的默認垃圾回收起G1相比,吞吐量降低不超過15%。
  • Epsilon:什麼事也不作的垃圾回收器(Epsilon: A No-Op Garbage Collector):這是一款不作垃圾回收的垃圾回收器。這個垃圾回收器看起來並沒什麼用,主要能夠用來進行性能測試、內存壓力測試等,Epsilon GC能夠做爲度量其餘垃圾回收器性能的對照組。
  • 加強var用法(Local-Variable Syntax for Lambda Parameters):在Java 11中,var能夠用來做爲Lambda表達式的局部變量聲明。

Java 12 於 2019 年3 月 19 日正式發佈,自Java 11 這一Long Term Support 版本發佈以後半年的又一次版本更新

主要特性:

  • 低暫停時間的 GC(Shenandoah: A Low-Pause-Time Garbage Collector )(Experimental):新增 Shenandoah 算法,經過與正在運行的 Java 線程同時進行 evacuation 工做來減小 GC 暫停時間。
  • Switch 表達式(Switch Expressions):擴展了 switch 語句,使其不只能夠做爲語句(statement),還能夠做爲表達式(expression)
  • 可停止的 G1 Mixed GC(Abortable Mixed Collections for G1) G1 及時返回未使用的已分配內存(Promptly Return Unused Committed Memory from G1):若是 G1 Mixed GC 存在超出暫停目標的可能性,則使其可停止。

Java 13 於 2019 年 9 月 17 日正式發佈,這一版本中引入了文本塊等功能。

主要特性:

  • 擴展應用程序類-數據共享(Dynamic CDS Archives):以容許在 Java 應用程序執行結束時動態歸檔類。歸檔類將包括默認的基礎層 CDS(class data-sharing)存檔中不存在的全部已加載的應用程序類和庫類。
  • 加強 ZGC 以將未使用的堆內存返回給操做系統(ZGC: Uncommit Unused Memory): ZGC 能夠將未使用的堆內存返回給操做系統
  • 可在生產環境中使用的 switch 表達式(Switch Expressions):在switch塊中引入了yield語句,用於返回值。
  • 將文本塊添加到 Java 語言(Text Blocks):引入多行字符串文字,在其中能夠放置多行的字符串,不須要進行任何轉義。

哪些特性改變你的代碼方式?

一、本地變量類型推斷

在之前的版本中,咱們想定義定義局部變量時。咱們須要在賦值的左側提供顯式類型,並在賦值的右邊提供實現類型,以下面的片斷所示:

MyObject value = new MyObject();
List list = new ArrayList();
複製代碼

在Java 10中,你能夠這樣定義對象:

var value = new MyObject();
var list = new ArrayList();
複製代碼

正如你所看到的,本地變量類型推斷將引入「var」關鍵字,而不須要顯式的規範變量的類型。

switch表達式

在JDK 12中引入了Switch表達式做爲預覽特性。在Java 13中又修改了這個特性,引入了yield語句,用於返回值。這意味着,switch表達式(返回值)應該使用yield, switch語句(不返回值)應該使用break。

在之前,咱們想要在switch中返回內容,仍是比較麻煩的,通常語法以下:

int i;
switch (x) {
    case "1":
        i=1;
        break;
    case "2":
        i=2;
        break;
    default:
        i = x.length();
        break;
}
複製代碼

在JDK13中使用如下語法:

int i = switch (x) {
    case "1" -> 1;
    case "2" -> 2;
    default -> {
        int len = args[1].length();
        yield len;
    }
};
複製代碼

或者

int i = switch (x) {
    case "1": yield 1;
    case "2": yield 2;
    default: {
        int len = args[1].length();
        yield len;
    }
};
複製代碼

三、文本塊支持

text block,文本塊,是一個多行字符串文字,它避免了對大多數轉義序列的須要,以可預測的方式自動格式化字符串,並在須要時讓開發人員控制格式。

咱們之前從外部copy一段文本串到Java中,會被自動轉義,若有一段如下字符串:

<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>
複製代碼

將其複製到Java的字符串中,會展現成如下內容:

"<html>\n" +
"    <body>\n" +
"        <p>Hello, world</p>\n" +
"    </body>\n" +
"</html>\n";
複製代碼

即被自動進行了轉義,這樣的字符串看起來不是很直觀,在JDK 13中,就可使用如下語法了:

"""
<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>
""";
複製代碼

使用「」「做爲文本塊的開始符合結束符,在其中就能夠放置多行的字符串,不須要進行任何轉義。看起來就十分清爽了。

後話

從2017到2019,不果短短兩年時間,Java就發佈了5個版本。每一個版本都會有不少特性出來,這些特性中雖然沒有像Java 8那樣提供函數式編程這樣的重大改變,可是也提供了switch表達式和block text等你們期待已久的特性。

2年過去了,在Java學習的道路上,你進步了嗎?歡迎談談你這兩年的變化。

相關文章
相關標籤/搜索