Java 13權威指南 - CodeFX
Java 13在一小時前釋出,這裡有你需要了解的一切:
如果您想自己使用程式碼,請檢視GitHub上的Java X Demo。
以下是Java 13最常見的IDE和構建工具的最低版本要求:
- IntelliJ IDEA:2019.2
- Eclipse:2019-09(4.13),帶有Java 13支援外掛
- Maven:3.5.0
- 編譯器外掛:3.8.0
- surefire和failsafe:2.22.0
- 使用ASM的外掛(例如,陰影外掛)也可能需要更新
- Gradle:6.0
在編譯為Java 13位元組碼時,請記住,您可能必須更新依賴於位元組碼操作的所有依賴項,例如Spring,Hibernate,Mockito等。
如果要使用文字塊或 Switch表示式(有關它們的詳細資訊,請參見下文),請在構建工具配置中包含此內容:
<!-- Maven's pom.xml --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <release>13</release> <compilerArgs> --enable-preview </compilerArgs> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>--enable-preview</argLine> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <configuration> <argLine>--enable-preview</argLine> </configuration> </plugin> |
// Gradle's build.gradle compileJava { options.compilerArgs += ["--enable-preview"] } test { jvmArgs '--enable-preview' } |
在IntelliJ IDEA中,將模組的語言級別設定為13(預覽)。在Eclipse中,找到Java Compiler配置並選中Enable preview features。
升級到Java 13時獲得的新語法:
文字塊
將跨越多行的字串放入程式碼中一直是Java的難點。現在,20多年後,我們終於得到了易於使用的多行字串,稱為文字塊:
// ugh! 以前寫法 String jsonLiteral = "" + "{\n" + "\tgreeting: \"Hello\",\n" + "\taudience: \"World\",\n" + "\tpunctuation: \"!\"\n" + "}\n"; // yay! java13寫法 String jsonBlock = """ { greeting: "Hello", audience: "World", punctuation: "!" } """; |
從Switch表示式返回值
在Java 12和13中引入了Switch表示式。在12中,您將使用break定義返回值 :
boolean result = switch (Bool.random()) { case TRUE -> { System.out.println("Bool true"); break true; } case FALSE -> { System.out.println("Bool false"); break false; } case FILE_NOT_FOUND -> { throw new UncheckedIOException( "This is ridiculous!", new FileNotFoundException()); } |
Java 13中你需要使用 yield:
boolean result = switch (Bool.random()) { case TRUE -> { System.out.println("Bool true"); // `yield` instead of `break` yield true; } case FALSE -> { System.out.println("Bool false"); yield false; } case FILE_NOT_FOUND -> { throw new UncheckedIOException( "This is ridiculous!", new FileNotFoundException()); } |
新的字串方法
String有三種新方法:
- String :: stripIndent的行為與編譯器用於刪除文字塊縮排的演算法相同。
- 類似地, String :: translateEscapes在轉換字串中的轉義序列時公開編譯器的行為。
- String :: formatted是重新實現靜態方法 String :: format的例項方法 。這意味著要呼叫 “價值:%s” 。formatted (value )等效於 String 。format (“Value:%s” ,value ) ,但更方便一點。
NIO改進
在NIO API中有一些小的改進:
⇝JDK -5029431:新增絕對批次 放置和 獲取方法
⇝JDK -8218418: 檔案。createSymbolicLink應該使用 SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
⇝ JDK-8215467: 檔案。是否隱藏應返回 真正的 Windows上的隱藏目錄
⇝ JDK-8218875:新增 檔案系統。newFileSystem (Path ,Map < String ,?> ) 方法
Socket和ServerSocket重新實現
Project Loom將引入光纖fibers (由JVM管理的輕量級執行緒),其中一部分是使塊的所有程式碼採用相同的路徑(因為這些路徑隨後被更改為不再阻塞執行緒)。
Java中重要堵塞是在 java.net.Socket 和java.net.ServerSocket下的類,它們的實現非常陳舊,並沒有與Loom的方法一致,因此在準備將來的更改時,此API已重新實現。這對我們來說不應該引起注意。
為AppCDS建立類資料存檔
應用程式類 - 資料共享(AppCDS)在Java 10中免費提供,並在12和13中得到改進。它透過將大部分類載入工作移出來減少啟動時間(減少10%到幾乎50%)和響應時間異常值程式執行。AppCDS不是在需要時從JAR載入類資料,而是準備一個不可變的歸檔檔案,並在JVM啟動時將其對映到記憶體中。(或“JVM”,因為存檔可以在多個例項之間共享。)
在Java 10上,使用存檔過去是一個三步過程:
- 建立要歸檔的類列表
- 建立檔案
- 與存檔一起釋出
Java 12透過引入JVM附帶並自動使用的JDK類的預設存檔來放寬這一點。但您仍然必須完成上述步驟才能建立包含應用程式類的存檔。這就是Java 13發揮作用的地方。
新的選項 - XX:ArchiveClassesAtExit告訴JVM照常執行,但退出(如果它沒有崩潰),對類資料寫入到指定的檔案。然後可以將其用於未來的計劃釋出:
# run without CDS & create archive java -XX:ArchiveClassesAtExit=dyn-cds.jsa -jar target/java-x.jar # use created archive java -XX:SharedArchiveFile=dyn-cds.jsa -jar target/java-x.jar |
此方法使用所謂的動態CDS存檔,使該功能更易於使用。如果您關心反射啟動時間,請試一試!
ZGC使用記憶體
Oracle的Z垃圾收集器(ZGC)是一種可擴充套件的低延遲垃圾收集器,旨在滿足獨立於堆或實時集大小(從幾百MB到幾TB)的暫停時間,並保持在10 ms以下。在Java 13中,堆大小可以是16 TB,ZGC可以將未使用的記憶體返回給作業系統。命令列引數 - XX:ZUncommitDelay = <秒>可以用於配置當發生這種情況。
然後有一個新的命令列標誌 - XX:SoftMaxHeapSize,通知垃圾收集器,試圖限制堆到指定的大小。如果本來耗盡記憶體,它允許使用更多的記憶體,-Xmx就應該可以很好地用於返回未使用的記憶體。
相關文章
- Netty權威指南:Java的I/O演進NettyJava
- JavaScript 日期權威指南JavaScript
- [譯] JAVASCRIPT 日期權威指南JavaScript
- JavaScript權威指南(6)——物件JavaScript物件
- Elasticsearch 權威指南(中文版)Elasticsearch
- javascript權威指南——函式篇JavaScript函式
- HBase權威指南【中文版】
- JavaScript權威指南(8)——函式JavaScript函式
- JavaScript權威指南(7)——陣列JavaScript陣列
- 微服務入門權威指南微服務
- 《Excelize 權威指南》新書釋出Excelize新書
- JavaScript權威指南(9)——類和模組JavaScript
- JavaScript權威指南(2)——詞法結構JavaScript
- 《Android Gradle權威指南》之Gradle入門AndroidGradle
- 《IDA pro權威指南》閱讀筆記筆記
- 留學指南權威乾貨與攻略!
- JavaScript權威指南(4)——表示式和運算子JavaScript
- HTML5權威指南——CSS的長度HTMLCSS
- Hadoop權威指南 第4章 關於YARNHadoopYarn
- Elasticsearch搜尋調優權威指南 (1/3)Elasticsearch
- 表格儲存Tablestore權威指南(持續更新)
- Elasticsearch搜尋調優權威指南 (2/3)Elasticsearch
- 【Kafka】《Kafka權威指南》——提交和偏移量Kafka
- HTML5權威指南 12.WebRTC通訊HTMLWeb
- Netty權威指南:I/O 多路複用技術Netty
- 《Spring Batch 權威指南》之“批處理和 Spring”SpringBAT
- Oracle Database 12cR2多租戶權威指南OracleDatabase
- JavaScript 權威指南第七版(GPT 重譯)(一)JavaScriptGPT
- JavaScript 權威指南第七版(GPT 重譯)(二)JavaScriptGPT
- JavaScript 權威指南第七版(GPT 重譯)(三)JavaScriptGPT
- JavaScript 權威指南第七版(GPT 重譯)(四)JavaScriptGPT
- JavaScript 權威指南第七版(GPT 重譯)(五)JavaScriptGPT
- JavaScript權威指南(11)——JavaScript的子集和擴充套件JavaScript套件
- JavaScript權威指南(10)——正規表示式的模式匹配JavaScript模式
- Kubernetes權威指南 第一章:Kubernetes入門
- 讀書筆記【JS 權威指南】14.1 計時器筆記JS
- 《MongoDB權威指南》迷你書連載一-入門篇MongoDB
- Netty權威指南:Linux網路 I/O 模型簡介NettyLinux模型