自JDK 8 以來所有Java和JVM新功能的分類列表
一個方便的參考,涵蓋從從Java 8到11及更高版本各種新語言功能到新版本命名方案的所有內容。
自從版本8釋出到版本11以來,Java由120個 JDK增強建議(JEP)構成,每個建議都為平臺帶來了一些改進。我決定閱讀它們並根據改進建立一個簡明的分類列表。
因為每個類別中都有許多功能,所以我決定不按時間順序顯示它們,而是從那些看起來最重要的功能開始。此外,我在每個類別的末尾新增了預期的JDK 12功能。
新語言功能
當Java 8引入lambdas時,這是一個非常巨大的變化。雖然最近的版本沒有新增這樣有影響力的功能,但是對該語言進行了許多小的改進。
1. JDK 10,JDK 11引入var使區域性變數宣告不那麼隆重的
var greeting = "Hello World!"; |
2. JDK 9(專案Jigsaw)加入和向後相容的模組系統,以避免ClassDefNotFoundErrors在執行時建立內部API
module hu.advancedweb.helloworld { requires hu.advancedweb.somedependency; exports hu.advancedweb.hello } |
3. JDK 9 介面中增加私有方法(Milling Project Coin)
4. JDK 9 加入匿名內部類的Diamond 運算子
5. JDK 9 加入Try-with-resources允許有效的最終final變數
6. JDK 9 加入@SafeVargs私有例項方法
7. JDK 9 import語句沒有了deprecation警告
8. JDK12: Switch Expressions(預覽版)
int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; |
新的API
讓我們繼續Java標準庫,重點關注我們可以在日常編碼中使用的新功能。
如果您對Java 8和11之間的所有API級別差異感到好奇,請檢查版本8和11之間的 Java API差異。
一般
- 便利工廠收集方法,以減輕沒有收集文字的痛苦JDK 9
Set<Integer> mySet = Set.of(1, 2, 3); List<Integer> myList = List.of(1, 2, 3); Map<String, Integer> myMap = Map.of("one", 1, "two", 2);
- 標準HTTP客戶端,具有HTTP / 2,WebSocket支援和非阻塞API JDK 9(孵化器),JDK 11(標準)
HttpClient httpClient = HttpClient.newBuilder().build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://advancedweb.hu/")) .GET() .build(); HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
- Reactive Streams釋出 - 訂閱框架,用於使用非阻塞背壓JDK 9進行非同步流處理
- 基於時間的增強CompletableFuture(超時,延遲)JDK 9
- 字串的改進,如isBlank,lines,repeat和stripJDK 11
- 更多轉換(dropWhile,takeWhile)和生成(iterate,ofNullable)流的選項; readonly collectors(toUnmodifiableList); 選項可以轉換為流JDK 9
- Arrays.mismatch:找到兩個陣列JDK 9之間的第一個不匹配元素
- Stack-Walking API允許懶惰和堆疊幀過濾JDK 9
- Process API提供更多資訊和控制(例如程式ID,引數,CPU時間,父/子程式),增強ProcessBuilder以幫助建立流程管道JDK 9
- VarHandleAPI來代替場和陣列相關的操作java.util.concurrent.atomic和sun.misc.Unsafe為了提供低階別的訪問mechamisms,例如原子寫入。JDK 9
- JDK 9的新組合器和查詢方法MethodHandle
- 增強的棄用政策。@Deprecated可以標記forRemoval,發出新警告。JDK 9
- OASIS標準XML目錄API,以安全,高效的方式管理XML中的外部資源JDK 9
- 將JDK的XML解析器Xerces更新為2.11.0版JDK 9
- TIFF支援影像I / O框架JDK 9
- 即將在JDK 12:字串增強功能:align,indent和transformJDK 12
- 進入JDK 12 :: Files.mismatch在兩個檔案JDK 12的內容中找到第一個不匹配的位元組
- 進入JDK 12: Collectors.teeing建立一個由兩個下游收集器JDK 12組成的收集器
國際化
- ResourceBundle以UTF-8而不是ISO-8859-1 JDK 9載入屬性檔案
- Unicode 10.0,新增大約27.000個字元,10個塊和30個以上的指令碼JDK 9(Unicode 8.0),JDK 11(Unicode 10.0)
- java.util.Locale和相關的API支援貨幣型別,時區和更多JDK 10
- 預設JDK 9啟用CLDR區域設定資料
圖形和桌面應用程式
- 適用於所有平臺的桌面功能,如登入/登出/鎖定事件監聽器和工作列互動JDK 9
- MultiResolutionImage這使得為DPI JDK 9輕鬆檢索特定於解析度的影像
- Windows和Linux JDK 9上的HiDPI Graphics
- 在Linux上為JavaFX,Swing和AWT JDK 9啟用GTK 3
- 使用Swing JDK 9的註釋替換@beaninfoJavadoc標記@BeanInfo
- 將JavaFX / Media中包含的GStreamer更新為1.4.4版JDK 9
- 用HarfBuzz JDK 9替換現有的ICU OpenType字型佈局引擎
效能改進
一般
- 節省空間的緊湊字串,可以更有效地儲存Latin-1字串JDK 9
- 異形和非分析編譯程式碼的程式碼快取記憶體是分開的,從而提高了JDK 9的效能和記憶體佔用
- 將Interned Strings儲存在類資料共享存檔中以減少記憶體消耗JDK 9
- 應用程式類 - 資料共享透過在Java程式之間共享類後設資料來縮短啟動時間並減少佔用空間。JDK 10
- 進入JDK 12:預設啟用預設類列表的類資料共享存檔,以改善開箱即用的啟動時間JEP 341
庫包相關
- 改進的內在的java.lang.Math sin,cos並且log功能上AArch64處理器版本的JDK 11
- 安全管理器效能改進JDK 9
- Spin-Wait Hint(ThreadonSpinWait)最佳化忙等待樣式迴圈JDK 9
- 在Java 2D中使用Marlin Renderer作為預設圖形光柵化器而不是Pisces JDK 9
- 利用最近推出的SPARC和Intel x64 CPU指令JDK 9,改進了GHASH和RSA效能
併發
- 改進了競爭物件監視器的效能JDK 9
- 關鍵部分的執行緒堆疊上的額外空間,java.util.concurrent在堆疊溢位的情況下降低鎖中死鎖的風險JDK 9
- Thread-Local握手停止單個執行緒JDK 10
編譯器
- javac中的效能改進:型別檢查多重表示式的新策略JDK 9
- Linux JDK 9(JVM編譯器介面),JDK 9(Graal作為AoT編譯器),JDK 10(Graal作為實驗性JIT編譯器)的實驗性提前編譯功能
垃圾收集器
- G1垃圾收集器現在是預設值而不是Parallel GC JDK 9
- G1 GC效能改進:並行完整GC以改善最壞情況延遲JDK 10
- 介紹Z垃圾收集器,它在大堆JDK 11上提供非常低的暫停時間
- 介紹Epsilon垃圾收集器,它不實現實際的記憶體回收,爭取儘可能低的開銷JDK 10,JDK 11
- XX:AllocateHeapAt=<path>支援替代記憶體裝置JDK 10
- 進入JDK 12: G1 GC效能改進:可中斷的混合集合,以滿足使用者提供的暫停目標,在空閒時自動將Java堆記憶體返回給作業系統JEP 344,JEP 346
- 進入JDK 12:介紹Shenandoah垃圾收集器,提供與ZGC類似的好處,但基於不同的演算法JEP 189
診斷和工具
- Flight Recorder是OpenJDK JDK 11的一部分
- 透過JMTI JDK 11進行低開銷堆分析
- C1和C2編譯器的執行時可管理和方法特定控制,支援包含測試JDK 9
- 針對JVM JDK 9(統一JVM日誌記錄),JDK 9(統一GC日誌記錄)的所有元件的細粒度,易於配置的日誌記錄系統
- 允許應用程式提供平臺類JDK 9使用的記錄器實現
- 參加JDK 12:基於JMH JEP 230的 Microbenchmark Suite
安全改進
- 驗證傳入的序列化資料JDK 9
- 預設金鑰庫型別是標準PKCS12,而不是專有的JKS JDK 9
- JDK提供了一組預設的根證照頒發機構(CA)證照,因此TLS連線正在開箱即用JDK 10
- 基於DRBG的SecureRandomJDK 9
- 使用基於SHA-1的簽名JDK 9禁用X.509證照鏈
- SHA-3雜湊演算法JDK 9
TLS
- TLS 1.3支援JDK 11
- 資料包傳輸層安全性API(DTLS)JDK 9
- OCSP裝訂TLS以提高證照狀態檢查JDK 9的效能
- TLS應用層協議協商(ALPN)擴充套件,無需額外往返即可實現協議協商; ALPN是HTTP / 2連線JDK 9的要求
加密
啟動
- jshell:Java REPL JDK 9(Project Kulla)
- 啟動單檔案原始碼程式,包括支援#!Unix JDK 11上的shebang()行
- 編譯老年人平臺版本的--release,其配置--source和--target以及對相應平臺版本連結JDK 9
- 早期驗證JVM命令列標誌以避免崩潰JDK 9
打包
- jlinkJava Linker可以為模組化Java應用程式構建最佳化的,纖薄的執行時映像,它只包含JDK JDK 9 的所需部分- [ 1 ],[ 2 ],[ 3 ],[ 4 ],[ 4 ], [ 5 ]
- 多發行版JAR檔案,允許在單個存檔JDK 9中使用多個特定於Java發行版的類
的Javadoc
位元組碼
- 為靜態字串連線生成的位元組碼使用invokedynamic而不是直接建立StringBuilderappend鏈。這將使字串連線的未來最佳化成為可能,而不需要更改位元組碼。JDK 9
- INVOKEDYNAMIC可以表示物件屬性和/或集合JDK 9的高階操作
- CONSTANT_Dynamic常量池條目,使用引導來執行解析度,類似於INVOKEDYNAMIC呼叫JDK 11
- 引入了包含相同程式碼實體中的類的Nest訪問控制上下文(例如巢狀類),並且無需編譯器將橋接方法插入到生成的位元組碼中。JDK 11
- 進入JDK 12: java.lang.invoke.constant包,允許輕鬆描述可載入常量(ldc指令的運算元),這比依賴於ad-hoc字串表示JEP 334更不容易出錯。
新平臺
JDK 9為另外三個平臺提供支援:
棄用和刪除
本節總結了Java 8和11之間的重大更改和棄用。
- 下劃線不再是有效的識別符號(JDK 9)
- var不再是有效的類名(JDK 10)
- 刪除Java EE(JDK 11)
- 刪除CORBA(JDK 11)
- 內部API(sun.*)被刪除或棄用(JDK 9 - [ 1 ],[ 2 ])
- 刪除apple.applescript和com.apple打包(JDK 9)
- 使用基於SHA-1的簽名禁用X.509證照鏈(JDK 9)
- 刪除啟動時JRE版本選擇指令:JRE-Version清單條目和-version:cli選項(JDK 9)
- 刪除jhat工具(JDK 9)
- 刪除JVM TI hprof代理(JDK 9)
- 刪除JDK 8中不推薦使用的GC組合(JDK 9)
- 刪除javah工具(JDK 10)
- 刪除Threaddestroy和Threadstop。
- 從JRE中刪除Endorsed Standards Override(lib/endorsed)和Extensions(lib/ext)機制。
- rt.jar從JRE中刪除。
- ResourceBundle以UTF-8而不是ISO-8859-1(JDK 9)載入屬性檔案
- 棄用Applet API(JDK 9)
- 棄用Nashorn Javascript引擎(JDK 11)
- 棄用併發標記掃描垃圾收集器(JDK 9)
- 棄用Object.finalize()(JDK 9)
- 棄用Pack200工具和API(JDK 11)
如果您對Java 8和11之間的所有API級別差異感到好奇,請檢查 Java Almanac專案。還要檢視 jdeps,Java類依賴性分析器,以確定您的專案是否仍在使用舊的內部API。
新版本計劃
總結
JDK 8於2014年釋出。我們不得不等待JDK 9的三年半。但從那時起事情就加速了。Java有一個新的釋出結構,旨在每六個月釋出一個新版本。JDK 10和 JDK 11已經推出了許多功能。
雖然仍然支援Java 8,但遷移到Java 11會為錶帶來大量改進。
相關文章
- JDK 16:Java 16的新功能 - InfoWorldJDKJava
- Java 中JDK7時間類與JDK8中的時間類JavaJDK
- JDK,JRE和JVMJDKJVM
- JDK、JRE和JVMJDKJVM
- JDK中自帶的JVM分析工具JDKJVM
- JDK環境變數的兩種配置方法——以JDK8和JDK10為例JDK變數
- JDK.JRE和JVMJDKJVM
- Java 8 後的新功能梳理Java
- 十分鐘內瞭解Java 8到Java 15的新功能 - DEVJavadev
- ES5 to ESNext — 自 2015 以來 JavaScript 新增的所有新特性JavaScript
- JDK 19:Java 19五個新功能 - infoworldJDKJava
- JDK、JRE和JVM簡述JDKJVM
- Java 8 Comparator: 列表排序Java排序
- Java JVM——8.堆JavaJVM
- 動態切換JDK8和JAVA17JDKJava
- 求1000以內所有偶數的和
- JDK JRE JVMJDKJVM
- JDK,JRE,JVMJDKJVM
- Java jvm 類載入 反射JavaJVM反射
- 【java】JDK5的新特性→→自動裝箱和拆箱JavaJDK
- jdk8:jvm虛擬機器記憶體模型JDKJVM虛擬機記憶體模型
- 自學java一路以來,心血心得整理分享Java
- Java 8 中的 Random 類Javarandom
- [java基礎]之JVM/JRE/JDK三者的關係JavaJVMJDK
- JDK8 String類知識總結JDK
- Java中異常分類和Throw和Throws的區別Java
- Java-JVM-類載入器JavaJVM
- JAVA8給我帶了什麼——並流行和介面新功能Java
- 人工智慧大模型的分類-來自智譜清言人工智慧大模型
- 擊後開啟某個分類的商品列表
- JVM組成以類載入方式(雙親委派機制)、jvm垃圾回收JVM
- 瞭解JDK、JRE、JVM及Java程式的編譯與執行JDKJVMJava編譯
- 遞迴樹形查詢所有分類遞迴
- Java容器類原始碼分析之Iterator與ListIterator迭代器(基於JDK8)Java原始碼JDK
- java中的內部類和自動拆裝箱Java
- 影像分類:來自13個Kaggle專案的經驗總結
- 一個JAVA應用啟動緩慢問題排查 --來自jdk SecureRandom 的困惑JavaJDKrandom
- Java8 Optional類Java