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

2022-01-22 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 -version
java version "10.0.1" 2018-04-17
Java(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");
String string = "hello java 10";
Stream<Integer> stream = Stream.of(1, 2, 3, 4);
ArrayList<String> list = new ArrayList();

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

僅限帶有初始化的程序的局部變量。

for 循環或者增強for 循環中。

for循環中的聲明。

下面演示三種使用情況。

public static void testVar() {
    // 情況1,沒有初始化會報錯
    // var list;
    var list = List.of(1, 2, 3, 4);
    // 情況2
    for (var integer : list) {
        System.out.println(integer);
    }
    // 情況3
    for (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::of
java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider
java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern
java.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);

輸出結果。

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

API 更新

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

var list = 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

在全民抗疫的特殊時期下,在人員複雜、流動量大地方的出入口處都設置了無接觸式無感紅外人體測溫系統。在這次疫情防控中,無感人體測溫系統發揮了怎樣的作用?高精準的無感人體測溫系統的核心技術武器是什麼?對於開發者們來說,大家應該了解哪些技術今晚7點多場景疫情防控:解讀雲邊端聯動下的全棧 AI 技術應用

☞兩成開發者月薪超 1.7 萬、算法工程師最緊缺!| 中國開發者年度報告

☞淘寶千萬級並發架構的十四次演進

☞Libra為何而生?Facebook為何要給 Libra創建Move語言?Calibra技術負責人給出了回答

相關焦點

  • 內卷300秒,Java 9 到 Java 16 ,精選,新特性!
    不過雖然暫時用不上最新版本的 JAVA,但了解每個新版本的主要特性還是很重要的,不然哪天真跟著升級了,那還不得一臉懵逼。本文就帶你快速了解 JAVA 9 - 16 的主要新特性,早學完早下班!;try (bufferReader0; bufferReader1) {    System.out.println(br1.readLine() + br2.readLine());}JAVA 10(2018年3月)局部變量的自動類型推斷(var)JAVA 10 帶來了一個很有意思的語法 - var
  • Java 8—Java 10 特性詳解
    為什麼出現默認方法為什麼要有這個特性? 首先,之前的接口是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改接口時候,需要修改全部實現該接口的類,目前的java 8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK裡給相關的接口添加新的方法及實現。
  • Java 15 正式發布, 14 個新特性,刷新你的認知!!
    不過沒關係,多了解一下,多掌握一點新東西,對你來說沒有壞處。新特性JDK 15 新特性一覽表:IDJEPFeature1339Edwards-Curve Digital Signature Algorithm (EdDSA)2360Sealed Classes (Preview)3371Hidden Classes4372Remove the Nashorn JavaScript Engine5373Reimplement
  • Java 9正式發布,新特性解讀
    作為霸佔程式語言排行榜鰲頭多年的老牌語言,Java 9 中有哪些不得不說的新特性?Java 語言的未來又將如何? 針對 Java 9 新特性的介紹已經非常多了,我這裡不想再做一個百科全書一樣的列表,希望從不同角度簡要點評部分特性。首先,談到 Java 9 大家往往第一個想到的就是 Jigsaw 項目,這是一個雄心勃勃的項目。
  • 面試官問我Java8~14的有哪些重要的新特性,我哭了~~~
    Java 8新特性見這裡:Java8新特性最佳指南 。Guide 哥:別人家的特性都用了幾年了,我 Java 才出來,哈哈!真實!Java9發布於 2017 年 9 月 21 日 。)Nashorn 引擎的增強 :Nashorn 從 Java8 開始引入的 JavaScript 引擎,Java9 對 Nashorn 做了些增強,實現了一些 ES6 的新特性I/O 流的新特性 :增加了新的方法來讀取和複製 InputStream 中包含的數據改進應用的安全性能
  • 300 秒快速了解 Java 9 - 16 新特性,助你脫離內卷
    不過雖然暫時用不上最新版本的 JAVA,但了解每個新版本的主要特性還是很重要的,不然哪天真跟著升級了,那還不得一臉懵逼。本文就帶你快速了解 JAVA 9 - 16 的主要新特性,早學完早下班!文件時,需要先 javac 編譯為 class,然後再用 java 執行,現在可以一把梭了:$ java HelloWorld.javaHello Java 11!
  • 300 秒快速了解 Java 9 - 16 新特性,助你脫離內卷
    不過雖然暫時用不上最新版本的 JAVA,但了解每個新版本的主要特性還是很重要的,不然哪天真跟著升級了,那還不得一臉懵逼。本文就帶你快速了解 JAVA 9 - 16 的主要新特性,早學完早下班!;try (bufferReader0; bufferReader1) {    System.out.println(br1.readLine() + br2.readLine());}JAVA 10(2018年3月)局部變量的自動類型推斷(var)JAVA 10 帶來了一個很有意思的語法 - var,它可以自動推斷局部變量的類型
  • Java 9 中的 9 個新特性
    如下是一個模塊描述器的示例,存在於 「module-info.java」 文件中:module blog {     exports com.pluralsight.blog;     requires cms;   }我們可以如下展示模塊:請注意,兩個模塊都包含封裝的包,因為它們沒有被導出(使用橙色盾牌可視化)。
  • 汽修工來達內學習java技術,逆襲職場獲得10萬年薪
    據相關數據統顯示,目前,我國對軟體人才的需求以每年20%左右的速度增長,其中java開發作為IT軟體開發行業的職位之一,需求呈現爆炸式增長,再加上平均薪資明顯高於其他崗位2—3K,更讓java開發在市場上的變得炙手可熱。畢業於中國農業大學汽車修理專業的大專生小邵參加達內java培訓(java.tedu.cn)成功轉行,獲10萬年薪入職軟通動力,以高薪名企逆襲職場。
  • 3分鐘帶你品嘗新鮮出爐的Java 17,看完就知道香不香!
    Java已經過了20個年頭了,Java8之後,JDK的發行計劃變了不少,半年一小聚,三年一大鬧。根據Oracle官方的的文檔,長期支持的Java版本是Java11 和 Java17。其中Java17計劃在2021年9月14號發布,Java17 將是一個長期支持的版本(Long Terms Support)。
  • 關於Java字符串(String)10個最常見問題
    這裡我們選取了網絡上最常見的10個問題,希望通過1. 如何對字符串進行比較?用「==」 還是equals()?簡單來說,如果引用是否相同那麼使用==, 判斷值是否相等則用equals()。除非你想判斷2個字符串是否是同一對象,否則你都應該使用equals()。2. 為什麼在安全敏感信息場合應該用char[]而不是string?
  • 騰訊音樂人2020原力計劃巡演燃動深圳
    隨著騰訊音樂人2020原力計劃巡演特別場深圳站於11月21日圓滿落下帷幕,記者今日從騰訊獲悉,原力計劃全國巡演接下來將在重慶、長沙、成都、西安、天津、石家莊,為樂迷朋友解鎖更多原創音樂的新玩法,帶去更多溫暖力量。目前,騰訊音樂人2020原力計劃巡演已走過南京,杭州,深圳三座城市。
  • Java | 第一個 SpringBoot 工程詳解
    Java | 如何使用 IDEA 構建 Spring Boot 工程學過編程的都知道,學習一門新語言的第一個項目肯定是 Hello World 。那這裡也不例外,我們先創建一個非常簡單的 Hello World 工程。給大家講解 SpringBoot 的項目目錄。創建信息如下:創建信息由於本文重點旨在講解 SpringBoot 的項目目錄。
  • 騰訊音樂2020原力計劃全國巡演正式開幕 10城唱響冬日最強Liveshow
    日前,騰訊音樂2020原力計劃全國巡演正式拉開帷幕,11月14日至12月11日連續四周,每周四、五、六晚,西北方言民謠代表人物張尕慫、原創音樂人閆澤歡、獨立女聲宋黛霆、實力唱作人袁野夕、另類搖滾樂團8點組樂團、原創音樂新銳飯卡等將領銜眾多國內優質音樂人,在南京、杭州、重慶、上海、深圳、成都、西安、天津、石家莊、長沙十大城市地標建築及場景下開唱
  • 從線上到線下,騰訊音樂人原力計劃用內容連接音樂人與樂迷
    這一將原創音樂融入不同生活場景的新主題模式,之所以受到樂迷粉絲追捧其實並不難理解。一方面在於騰訊音樂人原力計劃對於不同曲風、類型原創音樂人的扶持與持續耕耘,如今騰訊音樂人平臺匯聚原創歌曲數超85萬首與全平臺總播放量突破4000億的海量聽歌數據,透過不同城市、人群的數據分析,不難將合適的音樂帶給合適的人。
  • JDK/Java 15發布
    該特性主要用在特定領域的類,這些類主要用於保存數據,不提供領域行為。目前處於第 2 個預覽版本階段。373: Reimplement the Legacy DatagramSocket API重新實現舊版 DatagramSocket API,用易於維護和調試的更簡單、更現代的實現來代替java.net.DatagramSocket和java.net.MulticastSocketAPI 的基礎實現。
  • 閃爍之光原力水晶的共鳴玩法講解
    閃爍之光原力水晶的共鳴玩法講解。閃爍之光是一款以史詩神話為題材的放置卡牌類手遊,採用放置卡牌玩法,5V5全AI公平戰鬥。精美的神明立繪,DIY養成專屬神明團,自定義陣容戰鬥,不同流派觸發不同增益效果,還有趣味歷練,特色冠軍賽玩法,開啟全新的冒險世界。
  • 汽修畢業進達內java培訓,年薪10萬入職IT名企
    據相關數據統計,目前,我國對軟體人才的需求以每年20%左右的速度增長,其中java開發作為IT軟體開發行業的職位,需求呈現爆炸式增長,再加上平均薪資明顯高於其他崗位2-3K,更讓java開發在市場上的變得炙手可熱。畢業於中國農業大學汽車修理專業的大專生小邵參加達內java培訓成功轉行,獲10萬年薪入職軟通動力,以高薪名企實現職場逆襲。
  • 原力計劃 | 葉凡Danni:英倫少年的奇幻漂流
    Yes娛樂8月24日綜合報導 在騰訊音樂人·原力計劃20強中,有一位抱著吉他、彈著慵懶英式搖滾的少年,他用稚氣又憂鬱的聲音,唱著他在音樂這條奇妙探尋路上發生的一切。他是葉凡Danni。著名製作人李泉聽到他在原力計劃的參賽作品《Age Of Doing Wrong》後,感嘆:「對樂器的表現有自己的想法,特別棒,這首歌非常成熟。」
  • JDK/Java 14 發布
    總共 16 個新特性如下:305:Pattern Matching for instanceof (Preview)為 instanceof 運算符引入模式匹配(預覽階段)通過模式匹配,開發者可以用更簡潔和更安全的方式來表達通用的程序邏輯。