最通俗易懂的 Java 10 新特性講解|原力計劃

2021-01-07 CSDN

作者 | 未讀代碼,CSDN 博主

封圖 | CSDN 下載自 VCG

出品 | CSDN 博客

自從 Java 9 開始,Oracle 調整了 Java 版本的發布策略,不再是之前的 N 年一個大版本,取而代之的是 6 個月一個小版本,三年一個大版本,這樣可以讓 Java 的最新改變迅速上線,而小版本的維護周期縮短到下個版本發布之前,大版本的維護周期則是 3 年之久。10 就是這麼一個小版本,因為 Java 的後續版本基本都會包含之前新特性,所以還是把 Java 10 帶來的改變單獨寫一寫。

JEP 322 - 基於時間的版本號

就像上面說的,Java 調整了發布策略,為了適應這種發布節奏,隨之改變的還有 Java 版本號的記錄方式。

版本號的新模式是:$FEATURE.$INTERIM.$UPDATE.$PATCH

$FEATURE :基於發布版本,如 Java 10 的 10 。$INTERIM :問題修復和功能增強時 + 1,默認是 0 。$UPDATE :在進行兼容更新,修復新功能安全問題時 +1。$PATCH :特殊問題修復時 +1。查看自己的 Java 10 版本。

$ java -versionjava version "10.0.1"2018-04-17Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

JEP 286 - 局部類型推斷

JEP 286 提案讓 Java 增加了局部類型推斷(Local-Variable Type Inference)功能,這讓 Java 可以像 JS 裡的 var 或者其他語言的 auto 一樣可以自動推斷數據類型。這其實只是一個新的語法糖,底層並沒有變化,在編譯時就已經把 var 轉化成具體的數據類型了,但是這樣可以減少代碼的編寫。

你可以像下面這樣使用 var 語法。

var hashMap = new HashMap<String, String>();hashMap.put("wechat","wn8398");var string = "hello java 10";var stream = Stream.of(1, 2, 3, 4);var list = new ArrayList<String>();

如果你反編譯編譯後的這段代碼,你會發現還是熟悉的代碼片段。

HashMap<String, String> hashMap = new HashMap();hashMap.put("wechat", "wn8398");Stringstring = "hello java 10";Stream<Integer> stream = Stream.of(1, 2, 3, 4);ArrayList<String> list = new ArrayList();

var 看似好用,其實也有很多限制,官方介紹了 var 只能用於下面的幾種情況。

僅限帶有初始化的程序的局部變量。for 循環或者增強for 循環中。for循環中的聲明。下面演示三種使用情況。

publicstaticvoidtestVar() {// 情況1,沒有初始化會報錯// var list;var list = List.of(1, 2, 3, 4);// 情況2for (var integer : list) { System.out.println(integer); }// 情況3for (var i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }}

儘管對 var 的使用場景增加了很多限制,但在實際使用時你還是要注意,就像下面的代碼,你可能一眼並不能看出 result 的數據類型。

var query = "xxx";var result = dbUtil.executeQuery(query);

JEP 317 - 基於 Java 的 JIT 編譯器(實驗性)

這個功能讓基於 Java 開發的 JIT 編譯器 Graal 結合 Java 10 用在 Linux / x64 平臺上,這是一個實驗性的 JIT 編譯器,有人說這也是 Java 10 中最具有未來感的引入。Graal 其實在 Java 9 中就已經引入了,它帶來了 Java 中的 AOT (Ahead Of Time)編譯,還支持多種語言,如 Js、Python、Ruby、R、以及其他基於 JVM (如 Java、Kotlin)的和基於 LLVM (如 C、C++)的語言。

想切換到 Graal 可以使用下面的 jvm 參數。

-XX:+UnlockExperimentalVMOptions-XX:+UseJVMCICompiler

這裡面有一點我覺得很有意思,看這個圖。

這就很有意思了,Graal 是 Java 語言編寫的,用 Java 編寫的編譯器,然後用來將 Java 字節碼編譯機器代碼。

JEP 310 - 類數據共享

JVM 啟動時有一步是需要在內存中加載類,而如果有多個 jar,加載第一個 jar 的速度是最慢的。這就延長了程序的啟動時間,為了減少這個時間,Java 10 引入了應用程式類數據共享(CDS)機制,它可以把你想共享的類共享在程序之間,使不同的 Java 進程之間共享這個類來減少這個類佔用的空間以及加載速度。

JEP 307 - G1 並行全GC

早在 Java 9 時就已經引入了 G1 垃圾收集器,G1 的優點很多。而在 Java 10 中還是做了小小調整,當 G1 的並發收集線程不能快速的完成全 GC 時,就會自動切換到並行收集,這可以減少在最壞情況下的 GC 速度。

JEP 314 - Unicode 語言標籤擴展

這個提案讓 JDK 實現了最新的 LDML 規範中指定的更多的擴展。

主要增加了下面幾個擴展方法。

java.time.temporal.WeekFields::ofjava.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}java.util.Currency::getInstancejava.util.Locale::getDisplayNamejava.util.spi.LocaleNameProviderjava.text.DateFormat::get*Instancejava.text.DateFormatSymbols::getInstancejava.text.DecimalFormatSymbols::getInstancejava.text.NumberFormat::get*Instancejava.time.format.DateTimeFormatter::localizedByjava.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePatternjava.time.format.DecimalStyle::of

嘗試一下。

Currency chinaCurrency = Currency.getInstance(Locale.CHINA);Currency usCurrency = Currency.getInstance(Locale.US);System.out.println("本地貨幣:" + chinaCurrency);System.out.println("US.貨幣:" + usCurrency);String displayName = Locale.getDefault().getDisplayName();String displayLanguage = Locale.getDefault().getDisplayLanguage();String displayCountry = Locale.getDefault().getDisplayCountry();System.out.println("本地名稱:" + displayName);System.out.println("本地語言:" + displayLanguage);System.out.println("本地國家:" + displayCountry);int firstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();System.out.println("本地每周第一天:" + firstDayOfWeek);

輸出結果。

本地貨幣:CNYUS.貨幣:USD本地名稱:中文 (中國)本地語言:中文本地國家:中國本地每周第一天:1

API 更新

Java 10 刪除了部分 API,也增加了一些實用方法。比如可以通過 Collection.copyOf 複製得到一個不可改變集合,即使原來的集合元素發生了變化也不會有影響。

varlist = new ArrayList<String>();list.add("wechat");list.add("wn8398");List<String> copyList = List.copyOf(list);list.add("test");System.out.println(copyList);// result// [wechat, wn8398]

也為 Optional 增加了一個新的方法 orElseThrow。調用這個方法也可以獲取到 optional 中的 value , 但是如果 value 為 null ,就會拋出異常。

另外在 Stream 最後收集數據的時候,Collectors 可以直接指定收集的集合為不可變集合,像下面這樣。

list.stream().collect(Collectors.toUnmodifiableList());list.stream().collect(Collectors.toUnmodifiableSet());

其他更新

Java 10 的更新內容不止這些,上面只是列舉了常用的以及比較有意思的新特性。還有部分更新如:

JEP 312:Thread-Local Handshakes,JVM 內部功能,可以提高 JVM 性能。JEP 313:刪除了 javah 工具,說是刪除,其實功能已經包含在 Java 8 中的 javac 裡。JEP 316:讓 JVM 可以在備用的存儲設備(如 NV-DIMM)上分配堆內存,而不用更改程序代碼。JEP 319:在JDK中提供一組默認的根證書頒發機構(CA)證書。文章案例都已經上傳到 Github:niumoo/jdk-feature

本文為 CSDN 博主「未讀代碼」原創文章,CSDN 官方經授權發布。

原文地址:https://blog.csdn.net/u013735734/article/details/104510202

【End】

在全民抗疫的特殊時期下,在人員複雜、流動量大地方的出入口處都設置了無接觸式無感紅外人體測溫系統。

在這次疫情防控中,無感人體測溫系統發揮了怎樣的作用?高精準的無感人體測溫系統的核心技術武器是什麼?對於開發者們來說,大家應該了解哪些技術?

今晚7點《多場景疫情防控:解讀雲邊端聯動下的全棧 AI 技術應用》

相關焦點

  • Java 15 即將到來,新特性速覽!
    在發布前夕,我們不妨先一窺新版 JDK 的新特性:第二個外部內存訪問 API(孵化階段),它將使 Java 程序安全高效地訪問 Java 堆以外的外部存儲器。該 API 應該能夠在各種外部內存(如本機、持久和託管堆)上進行操作。
  • 學Java反射,看這篇就夠了 | 原力計劃
    場景三:反射最重要的用途就是開發各種通用框架。很多框架(比如Spring)都是配置化的(比如通過XML文件配置JavaBean,Action之類的),為了保證框架的通用性,它們可能需要根據配置文件加載不同的對象或類,調用不同的方法。
  • 你有真正理解 Java 的類加載機制嗎?|原力計劃
    這篇文章將通過對Java類加載機制的講解,讓各位熟練理解Java類的加載機制。在我們代碼中,我們只知道有一個構造方法,但實際上Java代碼編譯成字節碼之後,最開始是沒有構造方法的概念的,只有類初始化方法 和 對象初始化方法 。這個時候我們就不得不深入理解了!那麼這兩個方法是怎麼來的呢?
  • JAVA8 新特性詳解
    System.out.println(s);lt1.print("有一個參數");}}局部變量修改報錯如圖:若是強行修改也無法編譯通過Lambda表達式其他特性其中包含的元素可以認為是:seed,f(seed),f(f(seed))無限循環Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);這段代碼就是先獲取一個無限長度的正整數集合的Stream,然後取出前10個列印。
  • PHP接口特性的實例講解
    PHP接口特性的實例講解 如果你對於PHP接口特性還有些模糊,那麼我們可以通過對學習JAVA接口的知識,來說明PHP接口的一些相關知識。 作者:lhx1026來源:javaeye博客|2009-11-23 20:16
  • 【終極版】Java8 新特性全面介紹,強烈建議收藏
    Nashorn, JavaScript 引擎:Java 8提供了一個新的Nashorn javascript引擎,它允許我們在JVM上運行特定的javascript應用有很多人認為,Java 8 的一些新特性另 Java 開發人員十分滿意,在本篇文章中,我們將詳細介紹 Java 8 的這些新特性!
  • Java 10 新特性解密,引入類型推斷機制
    儘管最近的很多關注都集中在這些強大的新功能上,但下一個版本的Java:JDK 10已經開始準備了。在本文中,我們將粗略地介紹一下JDK 10的主要特性,並探討JDK 10中可能包含的一些特性。請注意,本文中所包含的信息在寫本文時是準確的。但是到發布時,JDK 10特性組預計將會增加。
  • 騰訊音樂發布「原力計劃」,攜手「初心」酸奶發掘原創之聲
    為了維護這些原創音樂人的音樂「初心」和創作熱情,新希望乳業「初心」酸奶攜手騰訊音樂人「原力計劃」,藉助原創迸發音樂能量。這一計劃將聚焦於原創音樂圈,面向原創音樂人在線徵集作品,進而通過層層篩選,選拔音樂達人,並為其匯聚頂尖圈內力量,助力原創音樂人的成長,讓其最大程度地釋放原創之力。
  • 關於每個版本特性的Java 面試題
    2、如果將javac設置為了Java5以下,那麼靜態導入等jdk1.5的特性都會報告錯誤。7)新的線程模型和並發庫Thread Framework(重要)答: 最主要的就是引入了 java.util.concurrent 包,這個都是需要重點掌握的。
  • JDK/Java 16 可能帶來什麼新特性?
    按 InfoWorld  所述,截至 2020 年 11 月 30 日,已有 14 個特性已被正式提了出來,還有 2 個特性則是預測性質。該計劃的目標包括:允許類或接口的作者控制負責實現它的代碼,提供比訪問修飾符更聲明性的方式來限制超類的使用,並通過提供模式分析的基礎來支持模式匹配的未來方向。 除了 misc.Unsafe 等關鍵的內部 API 外,默認情況下對 JDK 內部進行強封裝。用戶可以選擇自 JDK 9 以來默認的寬鬆的強封裝。
  • 原力計劃 | 葉凡Danni:英倫少年的奇幻漂流
    Yes娛樂8月24日綜合報導 在騰訊音樂人·原力計劃20強中,有一位抱著吉他、彈著慵懶英式搖滾的少年,他用稚氣又憂鬱的聲音,唱著他在音樂這條奇妙探尋路上發生的一切。他是葉凡Danni。著名製作人李泉聽到他在原力計劃的參賽作品《Age Of Doing Wrong》後,感嘆:「對樂器的表現有自己的想法,特別棒,這首歌非常成熟。」
  • Java 11新特性:棄用Nashorn JavaScript引擎
    Java 11將聲明棄用Nashorn JavaScript腳本引擎,相關API和jjs工具,並在未來的版本中移除這些特性。Nashorn JavaScript引擎在Java 8中首次引入,完整實現了ECMAScript-262 5.1標準。
  • 「核心基礎篇」Guide的Java後端書架來啦!都是Java程式設計師必看的書籍?
    這本書的講解非常通俗易懂,作者從並發編程基礎到實戰都是信手拈來。另外,這本書的作者加多自身也會經常在網上發布各種技術文章。這本書也是加多大佬這麼多年在多線程領域的沉澱所得的結果吧!他書中的內容基本都是結合代碼講解,非常有說服力!《實戰 Java 高並發程序設計》
  • Java新特性:數據類型可以扔掉了?
    所以使用 enum 關鍵字定義常量,儘管從 Java 語法上看起來與使用 class 關鍵字定義類、使用 interface 關鍵字定義接口是同一層次的,但實際上這是由 Javac 編譯器做出來的假象,從字節碼的角度來看,枚舉僅僅是一個繼承於 java.lang.Enum、自動生成了 values() 和 valueOf() 方法的普通 Java 類而已,因此枚舉也歸為引用類型了。
  • 我的世界:java版與基巖版,相差兩歲的哥弟倆,有多少不同特性?
    2009年,notch著手開發Minecraft的java版本。2011年,mojang工作室開發了Minecraft移動版,又稱攜帶版,最後被統稱為基巖版。從開發時間來講,java版與基巖版算是一對相差2歲的兄弟倆。由於版本不同,帶來了很多遊戲特性的差異。
  • 學Java不得不看的經典書籍
    【內容介紹】本書從初學者角度出發,通過通俗易懂的語言、豐富多彩的實例,詳細介紹了使用Java語言進行程序開發應該掌握的各方面技術。這些豐富的內容,包含了Java語言基礎語法以及高級特性,適合各個層次的Java程式設計師閱讀,同時也是高等院校講授面向對象程序設計語言以及Java語言的絕佳教材和參考書。【推薦理由】本書贏得了全球程式設計師的廣泛讚譽,即使是最晦澀的概念,在BruceEckel的文字親和力和小而直接的編程示例面前也會化解於無形。
  • Java核心技術精講PDF掃描版下載
    《Java核心技術精講》內容包括Java簡介、Java基礎語法、面向對象、異常的捕獲及處理、包及訪問控制權限、Java新特性、多線程、常用類庫、JavaIO操作、網絡編程、類集框架、Java資料庫編程、DAO設計模式、Eclipse開發工具。
  • 編程沒有銀彈:探討 Java 8 新增特性的優缺點
    Java 8或許是 迄今為止最令人期待的Java版本,最初定於今年的9月份發布,但由於一系列的安全漏洞問題,目前已推遲到明年的3月份。 而最主要的問題則是可讀性。隨著流鏈的加長,很有可能影響可讀性。其它問題則來源於內置的新東西來支持這個新路徑,這些是功能接口和Lambda。函數式接口在Java 8裡將會有一個全新的功能——函數式接口(functional interfaces),就是可以在接口裡面添加默認方法,並且這些方法可以直接從接口中運行。
  • JDK 11 已處於特性凍結狀態,看看 Java 11 API 變更提案
    自從上個月進入「減速(ramp-down)」階段以來,JDK 11 的特性已經處於凍結狀態。這些重大的變化已被列為 JEP(JDK Enhancement Proposal 特性增強提議)。
  • 實例講解:java reflection 發射機制
    Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。  JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟體組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。