日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK16的新特性

發布時間:2024/2/28 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK16的新特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • JDK16的新特性
  • 語言方面的提升
  • 內存管理方面的提升
  • Unix-Domain Socket Channel
  • Warning For Value-based Classes
  • 封裝內部的JDK包
  • C++ 14語言特性
  • 預覽語言新特性
  • 總結

簡介

在2021年3月16日,JDK的迎來了它的一個新版本JDK16,雖然JDK16不是LTS版本,但是作為下一個LTS版本JDK17的先行版本,JDK16為我們帶來了17個方面的提升,包括了新的語言特性、新的工具、內存管理的提升等方面。

所以一起來看看,JDK16到底為我們提供了些什么新的特性。

JDK16的新特性

總的來說,JDK16有下面的一些新特性:

  • 一些在JDK14中引入的新特性,最終在JDK16中確定了。
  • 內存管理的提升
  • 新的打包工具
  • UNIX-Domain Socket channels
  • Value-based Classes的警告
  • Encapsulating JDK Internals by default
  • 提供了 C++ 14語言特性
  • 其他的一些預覽版本的新特性

下面圖是JDK從8開始到16的新特性個數:

可以看到JDK8和JDK9是最多的,后面基本上變動比較少。

JDK8引入了stream,lambda,泛型等一系列非常有用的特性。而JDK9則引入了新的JPMS模塊化系統,所以變動比較多。

相對而言,JDK10之后變動基本上比較小,也有可能跟固定6個月發一次版本有關系。畢竟時間比較短,所以版本的變動也比較小。

注意,JDK16并不是一個LTS版本,在9月發布的JDK17才是!,大家可以關注我的后續關于JDK17新特性的文章。到現在為止,JAVA的LTS版本就有JDK8,JDK11和JDK17了。你現在用的是哪個呢?

語言方面的提升

JDK16在語言上的提升主要有兩個:Pattern matching和records。這兩個新特性都是在JDK14中作為預覽版本引入了,最終到JDK16變成了final版本。

先來看一下Pattern matching, Pattern matching主要說的就是instanceof關鍵詞,我們知道在JAVA中判斷一個對象是不是某個類的實例,則可以使用instanceof,如果是該類的實例或者子類,則返回true,否則返回false。

但是在判斷完之后,要想使用對應的對象,還需要顯示的進行類型轉換如下所示:

//傳統寫法if(site instanceof String){String stringSite = (String)site;System.out.println(stringSite.length());}

在JDK16中的Pattern matching中,可以這樣寫:

//JDK16寫法if(site instanceof String stringSite){System.out.println(stringSite.length());}

另外一個final版本的就是在JDK14和15中引入的Records,Records是一個特殊的java類,主要用來表示不可變對象的結構體。

來看一個Records的定義:

public record Address(String addressName,String city ) { }

上面我們定義了一個Address對象,它有兩個屬性,分別是addressName和city,如果反編譯上面代碼的編譯結果,可以得到:

public record Address(String addressName, String city) {public Address(String addressName, String city) {this.addressName = addressName;this.city = city;}public String addressName() {return this.addressName;}public String city() {return this.city;} }

實際上就等于傳統的:

public class AddressOld {private final String addressName;private final String city;public AddressOld(String addressName, String city) {this.addressName = addressName;this.city = city;}public String getAddressName() {return addressName;}public String getCity() {return city;} }

但是在編寫上要方便和簡單很多。

內存管理方面的提升

在看看內存管理方面的提升,主要有兩方面:Elastic Metaspace和ZGC的并發線程堆棧處理。

Metaspace 的主要功能是管理類的元數據的內存。 引入 Elastic Metaspace 是為了改進 HotSpot JVM 中元空間內存的分配和釋放。 可以更快地將不需要的內存返回給操作系統,從而減少開銷和內存碎片。

Elastic Metaspace使用較小的塊分配內存,并通過將未使用的元空間內存返回給操作系統來提高彈性。 它可以提高性能并降低維護成本。

那么什么是ZGC的并發線程堆棧處理呢?

我們知道ZGC是HotSpot JVM中一種低延時的垃圾回收算法。但是在線程的堆棧處理過程中,總有一個制約因素就是safepoints。在safepoints這個點,java的線程是要暫停執行的,從而限制了GC的效率。

而ZGC的并發線程堆棧處理可以保證java線程可以在GC safepoints的同時可以并發執行。

Unix-Domain Socket Channel

一般來說Socket通信是基于TCP/IP的,但是熟悉unix的朋友應該知道,在unix中一切都是以文件形式存在的,即便是在內部進程的通訊也是如此。

如果是同一個host上的進程進行通訊,使用unix本身的inter-process communication (IPC)無疑是最快的方式,并且更加安全。

所以在JDK16中增加了對Unix-Domain Socket Channel的支持。

Warning For Value-based Classes

這個是什么意思呢? 我們知道java中對應的primary類型都有一個Object類型,比如int對應的是Integer。

如果是用Integer的構造函數,則我們可以這樣構造:

Integer integer= new Integer(100);

但是在JDK16中,這種構造函數已經被廢棄了:

@Deprecated(since="9", forRemoval = true)public Integer(int value) {this.value = value;}

我們可以直接這樣寫:

Integer integer2= 100;

封裝內部的JDK包

一般來說,我們用的包都是JDK公開的API,但是有時候還是會用到一些JDK內部使用的類,這種類是不建議直接在外部使用的,JDK16對大部分的這種類做了封裝,后面大家直接在標準JDK中查找使用即可。

C++ 14語言特性

這個是值JDK底層的C++ 源代碼使用C++ 14語言特性,一般的JDK使用者是無法直接感受的。

預覽語言新特性

在JDK16中還加入了幾個預覽的語言新特性.這里主要講一下Vector API和Sealed Classes.

Vector API的想法是提供一種向量計算方法,最終能夠比傳統的標量計算方法(在支持 CPU 架構上)執行得更好。什么叫做向量計算呢?熟悉pandas的朋友可能知道,在pandas可以方便的對矩陣進行計算,如果用java實現則需要計算矩陣中的每個元素,非常麻煩,這也是python的pandas庫能夠流行的原因。

現在JDK16也可以做到了,我們一起來看看,先是傳統寫法:

//傳統寫法int[] x = {1, 2, 3, 4};int[] y = {4, 3, 2, 1};int[] c = new int[x.length];for (int i = 0; i < x.length; i++) {c[i] =x[i] * y[i];}

如果我們希望兩個數組的數字相乘,則只能進行每個元素的遍歷。現在的寫法:

var vectorA = IntVector.fromArray(IntVector.SPECIES_128, x, 0);var vectorB = IntVector.fromArray(IntVector.SPECIES_128, y, 0);var vectorC = vectorA.mul(vectorB);vectorC.intoArray(c, 0);

我們構建兩個Vector變量,直接調用Vector類的mul方法即可。

fromArray中有三個參數,第一個是向量的長度,第二是原數組,第三個是偏移量。因為一個int有4個字節,所以這里我們使用SPECIES_128。

Sealed Classes是在JDK15中引入的概念,它表示某個類允許哪些類來繼承它:

public sealed class SealExample permits Seal1, Seal2{ }public non-sealed class Seal1 extends SealExample { }public final class Seal2 extends SealExample { }

final表示Seal2不能再被繼承了。non-sealed 表示可以允許任何類繼承。

總結

以上就是JDK16給我們帶來的新特性,總體而言是很有用的,大家覺得呢?

本文例子learn-java-base-9-to-20

本文已收錄于 http://www.flydean.com/26-jdk16-new-features/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

總結

以上是生活随笔為你收集整理的JDK16的新特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。