中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDK16有哪些新特性

發布時間:2021-10-15 14:48:49 來源:億速云 閱讀:154 作者:iii 欄目:編程語言

本篇內容介紹了“JDK16有哪些新特性”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

新特性一覽


在開始之前,先讓我們來一起瀏覽一下JDK 16版本所帶來的17個新特性吧。
?  本文將解讀的新特性
357: OpenJDK源代碼倉庫從Mercurial遷移至Git。努力推動這一改變,將會在版本控制系統元數據大小、可用工具以及托管等方面體現優勢。
 
369: 遷移到GitHub,這個變化是基于OpenJDK源碼庫遷移至Git的,JDK 16源代碼倉庫將出現在最流行的程序員社交網站上。
 
386: 在x64和AArch74架構上,將JDK移植到Alpine Linux和其他使用musl作為其主要C庫的Linux發行版。Musl是 ISO C和Posix標準中描述的標準庫功能的Linux實現。Alpine Linux由于其鏡像小而被廣泛應用于云部署、微服務以及容器環境中。Linux版本的Docker容器鏡像小于6MB。讓Java在此類設置中開箱即用地運行,并允許Tomcat、Jetty、Spring和其它流行的框架在這些環境中工作。通過使用jlink來減少Java運行時的大小,用戶可以創建一個更小的鏡像,以運行特定的應用程序。
 
394: instanceof操作符的模式匹配,在JDK 14和JDK 15中都已預覽過,將于JDK 16最終確定。模式匹配使程序中的通用邏輯(即從對象中有條件的提取組件)可以更簡潔、更安全的表達。
 
395: 提供Record記錄類,作為不可變數據的透明載體。
?  其他的新特性
347: 啟用C++ 14語言功能,允許在JDK C++源代碼中使用C++ 14功能,并提供有關在HotSpot代碼中可以使用哪些功能的具體指導。
 
376: 將ZGC(可擴展低延遲垃圾收集器)線程堆棧處理從安全點移至并發階段。ZGC垃圾收集器旨在使HotSpot中的GC暫停和可伸縮性問題成為過去。
 
380: 添加Unix-Domain Socket Channels,其中Unix-Domain(AF_UNIX)套接字的支持被添加到nio.channels包中的Socket Channel和Server Socket Channel API中。
 
387: 彈性Metaspace功能可將未使用的HotSpot虛擬機的Class Metadata(Metaspace)占用的內存更迅速的返回給操作系統,從而減少Metaspace的占用并簡化Metaspace的代碼以降低維護成本。
 
388: 將JDK移植到Windows/AArch74平臺。
 
389: 孵化階段的外部鏈接程序API,支持靜態類型的純Java方式訪問本地代碼。此計劃的目的在于通過用更高級的純Java開發模式來替換JNI(Java本機接口),以提供與C語言的交互。它的性能將會比JNI更加優越。
 
390: 基于值的類的警告建議:將原始包裝類指定為基于值的類,棄用其構造函數以進行移除,并提示新的棄用警告。在Java平臺中對于任何基于值的類的實例進行同步的錯誤嘗試會予以警告。
 
392: 提供用于打包獨立的Java應用程序的jpackage工具。
 
396: 默認情況下,JDK內部結構是強封裝的,而關鍵內部API(例如misc.Unsafe)除外。此計劃的目標包括提高JDK的安全性和可維護性,并鼓勵開發人員從直接使用內部元素逐漸遷移為使用標準API,這樣開發人員和最終用戶都可以輕松地升級到 Java 的未來版本。
 
397: 之前在JDK 15中進行過預覽,JDK 16中二次預覽的密封類和接口限制了可以擴展或實現它們的類和接口。此計劃的目標包括允許類或接口的創建者控制負責實現它的代碼,提供比訪問修飾符更聲明性的方式來限制超類的使用,并通過提供模式分析基礎來支持模式匹配的未來發展。
 
338: 孵化階段的矢量API(JDK將配備一個孵化器模塊),jdk.incubator.vector,以表達在可支持的CPU架構上編譯為最佳硬件指令的矢量計算,以實現優于等效標量計算的性能。
 
393: 孵化階段的外部存儲器訪問API,允許Java程序安全的訪問Java堆外的外部存儲器(包括本地、持久化介質以及托管堆存儲器)。
 
如上新特性前編號為JDK Enhancement Process的標識符,詳見文末參考資料

立即嘗鮮


瀏覽完17個新特性后,我都迫不及待的想嘗試一下JDK 16,以及其中一些對工程上有所幫助的特性了。
那么先通過JDK官網進行  JDK 16候選版下載(http://jdk.java.net/16/)  。
 
由于要方便的在系統中針對多個JDK版本進行切換,可以使用  jenv(https://github.com/jenv/jenv)  。

我們把下載好的JDK16路徑添加到jenv,在做如下設置即可使用。
jenv add ${JDK16_Path}jenv global openjdk64-16
 
如果一切順利,那么查看JDK版本時,會有類似如下信息的返回。
java -versionopenjdk version "16"2021-03-16OpenJDK Runtime Environment (build 16+36-2231)OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing)

如果你在使用較早的IDEA版本作為開發工具,那么使用JDK 16運行程序時,可能收到如下的錯誤:
Cannot determine path to 'tools.jar' library for 16 (path/to/jdk-16) when running from IDEA, you should update to the latest version.
 
這是由于JDK9對Java運行時做了重構,已刪除了rt.jar、tools.jar、dt.jar以及其它各種內部JAR包。而在較早的開發工具通常對這類JAR包有依賴,通過升級IDEA可以解決。
到官網獲取一個  IDEA 2021.1 EAP預發版本

新特性解讀


?  遷移到GitHub
早在2020年9月,OpenJDK已將Github上的jdk倉庫作為JDK 16源碼的主讀取/寫入倉庫。隨著JDK 16的正式發布,這將是OpenJDK在Github上開發完成的初代JDK版本。
 
而促使將OpenJDK源代碼倉庫從Mercurial遷移到Git的三個主要原因:版本控制系統元數據,可用工具和可用托管的大小。

  • 版本控制元數據大小方面,轉換后的存儲庫的初始原型已顯示出版本控制元數據的大小顯著減少。例如,使用Git的jdk倉庫的.git目錄大約為300MB,而使用Mercurial的.hg目錄大約為1.2GB。減少元數據可保留本地磁盤空間并減少克隆時間,同時減少傳輸的數據。

  • 可用工具方面,與Mercurial相比,Git可用的工具更多。所有的文本編輯器都可以本地或通過插件實現Git集成。此外,幾乎所有的IDE都帶有Git集成,包括Eclipse、Visual Studio、IDEA。

  • 可用托管方面,有許多選項可用于托管Git倉庫,無論是自托管還是作為服務托管。使用外部源碼托管提供程序的原因包括性能、與開發人員進行交互的Web API的訪問權限控制 以及 蓬勃發展的社區。 

OpenJDK遷移到Github之后,對于Java開發者而言還是有不少的便利:
  • 通過fork一份JDK 16源碼倉庫,可以一邊閱讀源代碼,一邊做筆記并提交,方便持續學習JDK源碼。使用Git的upsteam保持JDK源碼的更新,同時也保持自我更新。

  • 如網速夠快,通過Github在線閱讀代碼的工具Github1s,快速在瀏覽器中翻閱JDK 16源碼也是非常方便。

如果是在IDEA下工作與學習,clone好JDK 16源碼,

打開Project Structure (command+;),設置Project SDK為JDK 16,并設置Project language level到16。

之后就可以愉快的看JDK 16源碼了。

JDK16有哪些新特性

?  將JDK移植到Alpine Linux
 
在云原生時代,個人理解提升效率是第一原則:
  • 更小的鏡像體積分發時會更加迅速

  • 應用程序/容器的啟動要迅速


這樣就能保障系統水平伸縮夠快、問題出現時回滾處理夠快。

另外,出于降低成本考慮,更小的鏡像體積內存占用會更小,分發時耗用的資源也更小。
 
Alpine Linux就是與云原生的提升效率原則契合的一款獨立的非商業性的通用Linux發行版。

其關注于安全性、簡單性和資源效率,圍繞musl libc和busybox構建。這使得它比傳統的GNU/Linux發行版更小。

JDK移植到Alpine Linux后,將允許Tomcat、Jetty、Spring和其它流行的框架在其中工作。用戶可以創建一個更小的鏡像,以啟動、運行特定的應用程序。
 
提前準備好Docker,我們先構建一個Alpine Linux鏡像,然后添加JDK 16,最后運行一個簡單的Spring Boot程序來演示一下。
?  構建Alpine Linux鏡像

# 獲取Alpine Linux鏡像docker pull alpine# 運行鏡像docker run alpine echo'Hello Alpine!'
 
通過docker images命令查看鏡像大小會發現,alpine在截止本文完成時,鏡像大小僅僅只有5.6MB。相對于debian、ubuntu、centos等系統動則幾十甚至上百MB的鏡像來說,alpine可是真的小!

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEalpine              latest              7731472c3f2a        7 weeks ago         5.61MB
?  添加JDK 16

OpenJDK通過使用jlink(  JEP 282:https://openjdk.java.net/jeps/282  )來減少Java運行時的大小,我們可以從DockerHub上獲取鏡像:
16-jdk-alpine(https://hub.docker.com/_/openjdk?tab=tags&page=1&name=16-jdk-alpine&ordering=last_updated)  。
或者如下Docker命令:
docker pull openjdk:16-jdk-alpine

?  運行Spring Boot

 
先準備一個Spring Boot的FatJar程序,可以從Spring Boot官網獲取  Hello World!樣例程序(https://spring.io/guides/gs/rest-service/)  。
創建一份Dockerfile,使用openjdk:16-jdk-alpine,并添加Spring Boot程序。
FROM openjdk:16-jdk-alpineVOLUME /tmpARG JAR_FILEADD ${JAR_FILE} app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
 
?  構建并運行

 
# 構建鏡像,設置JAR_FILE參數指向Spring Boot程序Jar包路徑docker build --build-argJAR_FILE=target/rest-service-0.0.1-SNAPSHOT.jar -t alpine-jdk16-app:latest . # 查看鏡像docker images # 根據鏡像,啟動容器運行# -d參數 后臺運行# -p參數 Spring Boot默認端口8080,映射到容器端口8080docker run -d-p8080:8080 alpine-jdk16-app:latest # 查看容器運行docker ps # 驗證成功之后可以停止容器docker stop${CONTAINER_ID} # 訪問應用curl-w'\n' http://127.0.0.1:8080/greeting?name=jdk16

JDK16有哪些新特性


至此,通過Alpine Linux系統帶JDK 16運行時的Spring Boot已經啟動并可以正常的訪問了。

Alpine系統JDK 16鏡像大小約為321MB。相比Oracle官方的Linux版本鏡像的467MB,減少30%+。

記錄類


從JDK 14開始提供了Record記錄類的預覽特性,這一特性將成為JDK 16的一項永久性特性。  Record記錄類作為不可變數據的透明載體,其是為了回應有關Java過于冗長拘謹的抱怨。  此計劃的目標包括設計一個表示簡單值集合的面向對象的構造函數,幫助開發人員專注于對不可變數據的建模而不是擴展行為,自動實現數據驅動的方法(例如 equals() 和 屬性的訪問器)。  
 
通過較新版IDEA可以創建此類型:

JDK16有哪些新特性


聲明Record記錄類后,幾乎不需要添加額外的代碼,一組隱式聲明讓其代碼書寫很簡潔:

  • 隱式聲明了屬性

  • 隱式聲明了構造器

  • 隱式聲明了equals()、hashCode()、toString()

  • 隱式聲明了屬性的訪問器,訪問器名稱與屬性同名


public record Point(int x, int y) {}

Record記錄類支持Local Classes特性,那么當需要臨時使用Record的時候,就可以非常方便的定義與使用:
List<Merchant>findTopMerchants(List<Merchant> merchants, int month) {    // Local record    record MerchantSales(Merchant merchant, double sales) {}     // 使用MerchantSales Record類臨時包裝merchant和sales,方便做處理。    return merchants.stream()        .map(merchant ->new MerchantSales(merchant, computeSales(merchant, month)))        .sorted((m1, m2) ->Double.compare(m2.sales(), m1.sales()))        .map(MerchantSales::merchant)        .collect(toList());}
Record記錄類將可以代替Tuple、Pair等之前在JDK之外的工具庫提供的元組功能,在與下面將介紹的模式匹配特性配合,可使代碼將變得非常簡潔。
?  模式匹配
從JDK 14開始引入了一種模式匹配的預覽特性,這一特性也將成為JDK 16的一項永久性特性。因此雖然JDK 16是個短期版本,也不妨礙我們在未來的JDK版本中繼續使用模式匹配特性。
 
模式匹配的現階段僅限于一種模式(類型模式)和一種語言構造(instanceof),但這只是完整特性的一部分。即便如此,我們也已經獲得了一個顯著的好處:冗余的強制轉換消失了,消除了冗余的代碼,使更重要的代碼得到了更清晰的關注,同時消除了隱藏bug的地方。
 
舉個例子:
我們在開發中當需要解析對象會用到類似如下的方式
if (obj instanceofString) {    String s = (String) obj;    ...}

使用模式匹配后的等價代碼:
if (obj instanceofString s) {    // 通過使用模式匹配可以直接使用s局部變量    ...}

代碼看起來是不是整潔了許多。

使用instanceof獲取對象類型是一種條件提取形式,在獲得到對象類型之后,總是要將對象強制轉換為該類型。

以前在instanceof之后必須進行顯式類型轉換,這是一種繁瑣的操作,而融合這些操作的好處不僅僅是為了簡潔,它還消除了一個常見的錯誤來源:在剪切和粘貼instanceof及強制轉換代碼,容易在修改了 instanceof的類型之后忘記修改強制轉換類型,這就給了漏洞一個藏身之處。通過instanceof的模式匹配消除了這個問題,我們還可以消滅所有這種類型的bug。
 
另一個需要經常的做此類“先檢測后強制轉換”的地方是equals方法。
再來看一個例子:
publicbooleanequals(Object o) {    if (!(o instanceof Point))        returnfalse;    Point other = (Point) o;    return x == other.x && y == other.y;}
 
使用模式匹配后的等價代碼:
publicbooleanequals(Object o) {    return (o instanceof Point other)        && x == other.x && y == other.y;}

這段代碼起到同樣的效果,但更簡單直接,因為我們可以只使用一個復合布爾表達式來表達一個等價的條件,而不是使用控制流語句。
 
模式匹配的綁定變量(如上代碼例子中 obj instanceof String s的s就是一個綁定變量)除了特殊的聲明位置以外,其作用域也與"普通"局部變量有所不同。

比如我們可以這樣寫:
if (a instanceof Point p) {    // p is in scope    ...} else {    // p not in scope here} // p not in scope here if (b instanceof Point p) {     // Sure!        ...}
這樣特殊的作用域讓我們能夠在if-else的多分支情況下,自由的重新聲明綁定變量,也考慮未來在switch中的case也是如此便利。如:
if (x instanceofInteger num) { ... }elseif (x instanceofLong num) { ... }elseif (x instanceofDouble num) { ... }
如果模式匹配可以消除Java代碼中99%的強制類型轉換操作,那么它肯定會很流行。但還不僅限于此,隨著時間的推移,將會出現其他類型的模式,它們可以進行更復雜的條件提取,使用更復雜的方式來組合模式,以及提供其他可以使用模式的構造:比如switch,甚至是catch,再加上目前已永久支持的Record類以及在預覽中的密封類等相關特性,模式匹配未來一定能夠大大簡化我們編寫的代碼。

“JDK16有哪些新特性”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jdk
AI

江西省| 黎平县| 北海市| 台湾省| 正镶白旗| 元江| 定日县| 田东县| 莒南县| 普陀区| 舟曲县| 东方市| 西平县| 常熟市| 南陵县| 鹿泉市| 广东省| 永丰县| 宁城县| 梁平县| 建昌县| 岱山县| 横山县| 肃北| 安国市| 东丰县| 邵武市| 西峡县| 麻城市| 台前县| 安庆市| 辉南县| 荃湾区| 霍林郭勒市| 皋兰县| 木里| 泸西县| 沾益县| 潢川县| 论坛| 陵川县|