日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1. JDK版本变迁和各版本新特性

發布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1. JDK版本变迁和各版本新特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDK從1995年發布起至今已歷經20多年,從JDK1.0升級到JDK17(October 19, 2021),本節先一起回顧一下JDK的版本變遷和各版本的新特性

版本變遷

  • 1995年5月23日,Java語言誕生;

  • 1996年1月,第一個JDK-JDK1.0誕生;

  • 1996年4月,10個最主要的操作系統供應商申明將在其產品中嵌入Java技術;

  • 1996年9月,約8.3萬個網頁應用了Java技術來制作;

  • 1997年2月18日JDK1.1發布

  • 1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議紀錄;

  • 1997年9月,JavaDeveloperConnection社區成員超過十萬;

  • 1998年2月,JDK1.1被下載超過2,000,000次;

  • 1998年12月8日Java 2企業平臺J2EE發布

  • 1999年6月,SUN公司發布Java三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME)

  • 2000年5月8日,JDK1.3發布

  • 2001年6月5日,Nokia宣布到2003年將出售1億部支持Java的手機;

  • 2001年9月24日,J2EE1.3發布;

  • 2002年2月26日,J2SE1.4發布,此后Java的計算能力有了大幅提升

  • 2004年9月30日,J2SE1.5發布,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為Java SE 5.0;有諸多重大新特性;代號:Tiger(里程碑版本)

  • 2006年12月,SUN公司發布JDK6.0;代號: Mustang 此版本持續了5年之久才發布新版本,是最經典的版本。

  • 2009年12月,SUN公司發布Java EE 6;

  • 2010年11月,由于甲骨文對Java社區的不友善,因此Apache揚言將退出JCP;

  • 2011年7月28日,甲骨文發布Java SE 7;

  • 2014年3月18日,甲骨文發表Java SE 8。(重大版本 - LTS)

  • 2017年9月21日,JDK9發布。從JDK9開始固定為每半年一個版本,更新內容相應縮減。

  • 2018年3月21日,JDK10發布。

  • 2018年9月25日,JDK11發布。(長期維護版本 - LTS)

  • 2019年3月19日,JDK12發布。

  • 2019年9月17日,JDK13發布。

  • 2020年3月17日,JDK14發布。

  • 2020年9月15日,JDK15發布。

  • 2021年3月16日,JDK16發布。

  • 2021年9月, JDK17發布。(長期維護版本 - LTS)

版本新特性

對重要版本的新特性做一下說明。

JDK1.2

改進集合框架,如新增HashMap替代舊的HashTable(常用)
開始提供JIT(Just In Time)編譯器;

JDK1.3

Dynamic Proxy: 加入了JDK動態代理(常用)

JDK1.4

NIO: 在傳統BIO的基礎上引入了NIO(Non-Blocking IO)(常用)。

JDK5(2004-09)

里程碑版本,大部分人也是從該版本開始接觸Java。引入了很多意義深遠的特性,如下:
1)自動拆箱/裝箱(Auto Inbox/Outbox)(常用)
2)枚舉(Enum)(常用)
3)靜態導入 (static import)
4)可變參數列表 (var args)(常用)
5)范型(Generic)(常用)
6)增強for循環(for-each)(常用)
7)注解(Annotation)(常用)
8)協變返回類型:實際返回類型可以是要求返回類型的一個子類
9)concurrent并發包(Doug leg)(常用)

JDK6(2006-12, LTS)

1)Compiler API,可以實現動態編譯Java源文件,如jsp編譯引擎就是動態的,修改后無需重啟服務器
2)對腳本語言的支持:如js, ruby,groovy

注:因JDK6至JDK7中間間隔了足足5年,所以這個版本是個經典版本,很穩定,官方長期維護,使用了很長時間。

JDK7(2011-07, LTS)

JDK7版本從JDK6后5年才發布,原因是中間經歷了Sun公司被收購。大體發布歷程是:

2009 年 1 月, Sun 開始開發 JDK7 Milestone 1。
2009 年 11 月,Sun 在 Devoxx 2009 大會上宣布將閉包特性加入 JDK7,并將 JDK7 的發布日期推遲到 2010 年底。
2010 年 4 月,Oracle 收購 Sun。
2010 年 9 月,Mark Reinhold 在 JavaOne 大會上宣布 JDK7 將砍去 Lambda、Jigsaw 和部分 Coin 新特性并于 2011 年中發布,其余部分的新特性將于 2012 年底同 JDK8 一同發布。
2010 年 10 月,IBM 宣布加入 OpenJDK,將與 Oracle 合作共同開發 JDK。此后,Apple 和 SAP 也陸續加入 OpenJDK 社區。
2011 年 7 月 28 日,Oracle 正式發布 JDK7,并指定 OpenJDK7 為參考實現。

特性一:一組小的改進
1)Switch支持String(常用)
2)try … with … resource(常用)
3)范型類型自動推斷(常用)
4)多重catch(常用)
5)數字可用下劃線分割

特性二:G1垃圾回收器(Grabage-First Collector)(常用)
新出的垃圾回收器,用來替代Concurrent Mark-Sweep Collector(CMS)。目標是減少 Full GC 帶來的暫停次數,增加吞吐量。

特性三:concurrent包改進(常用)
Doug Lea在此版本引入了輕量級的fork/join框架來支持多核多線程的并發計算。此外,實現了 Phaser 類,它類似于 CyclicBarrier 和 CountDownLatch 但更靈活。最后,ThreadLocalRandom 類提供了線程安全的偽隨機數生成器。

特性四:IO與網絡的更新
NIO2 主要包括了 3 個方面的改進:

  • 新的文件系統 API 支持大量文件屬性的訪問、文件系統監控服務、平臺相關的 API,如 DosFileAttributes 和 PosixFileAttributes 等,以及一個可插拔文件系統的 SPI。
  • Socket 和文件的異步 IO。
  • Socket channel 的功能完善,支持 binding、多播等。
  • 特性五:JDBC更新(常用)
    支持JDBC4.1和Rowset 1.1

    JDK8(2014-03, LTS)

    1)接口默認方法(常用)
    即接口中可以聲明一個非抽象的方法作為默認的實現,方法的返回類型前要加上“default”關鍵字
    2)lambda表達式(常用)

    3)函數式接口(常用)
    指僅僅包含一個抽象方法的接口,需要標記@FunctionalInterface
    4)使用 :: 來傳遞方法引用,是lambda的簡寫(常用)

    5)Stream API(常用)

    6)新的日期工具類(常用)

    JDK9(2017-09)

    1)模塊化
    即只加載應用運行需要的模塊

    2)改進的Java doc
    生成的Java doc符合H5標準,支持API搜索

    3)集合工廠方法,優化集合初始化(常用)

    Set<Integer> ints = Set.of(1,2,3); List<String> strings = List.of("first","second");

    4)改進 Stream API

    IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

    5)支持私有接口方法

    6)HTTP/2(常用, 是預覽版)
    新的方式處理HTTP調用,用于替換 HttpURLConnection,并提供對WebSocket和HTTP/2的支持

    7)多版本兼容

    JDK10(2018-03)

    1)局部變量類型推斷(常用)
    即只能作為局部變量類型,方法參數,返回類型等不可以。常見示例:

    var str = "ABC"; //根據推斷為 字符串類型 var l = 10L;//根據10L 推斷long 類型 var flag = true;//根據 true推斷 boolean 類型 var flag1 = 1;//這里會推斷boolean類型。0表示false 非0表示true var list = new ArrayList<String>(); // 推斷 ArrayList<String> var stream = list.stream(); // 推斷 Stream<String>

    2)并行full gc的G1
    通過并行Full GC, 改善G1的延遲。目前對G1的full GC的實現采用了單線程-清除-壓縮算法。JDK10開始使用并行化-清除-壓縮算法。

    3)基于實驗Java的JIT編譯器
    啟用基于Java的JIT編譯器Graal,它是JDK9中引入的Ahead-of-time(AOT)編譯器的基礎。

    JDK11(2018-09, LTS)

    1)增加一些實用API(常用)

    String str = "woshidage"; boolean isblank = str.isBlank(); //判斷字符串是空白 boolean isempty = str.isEmpty(); //判斷字符串是否為空 String result1 = str.strip(); //首尾空白 String result2 = str.stripTrailing(); //去除尾部空白 String result3 = str.stripLeading(); //去除首部空白 String copyStr = str.repeat(2); //復制幾遍字符串 long lineCount = str.lines().count(); //行數統計

    2)HttpClient增強(常用,已轉換為正式版)
    同時提供了同步調用和異步調用實現。JDK對http對調用支持已經足夠強,以前apache提供的httpComponents基本可以去除了。

    4)ZGC
    JDK11最矚目的特性,但目前是實驗性質的。目標是GC暫停時間不會超過10ms,既能處理幾百兆的小堆,也能處理幾個T的大堆。

    5)完全支持Linux容器(常用)
    JDK10開始,JVM可以識別當前是否在容器中運行,能接受容器設置的內存限制和CPU限制。

    JDK12(2019-03)
  • Switch Expression
    傳統使用switch的方式:
  • switch (day) {case MONDAY:case FRIDAY:case SUNDAY:System.out.println(6);break; case TUESDAY:System.out.println(7);break; case THURSDAY: case SATURDAY:System.out.println(8);break; case WEDNESDAY:System.out.println(9);break; }

    如今可簡化為:

    switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); case TUESDAY -> System.out.println(7); case THURSDAY, SATURDAY -> System.out.println(8); case WEDNESDAY -> System.out.println(9); }
    JDK13(2019-09)
  • 字符串拼接
  • JDK13前:

    String html = "<html>\n" +" <body>\n" +" <p>Hello, world</p>\n" +" </body>\n" +"</html>\n";

    現在:

    String html = """<html><body><p>Hello, world</p></body></html>""";
  • 重寫實現舊版套接字API
    使用更簡單、更現代的實現替換java.net.Socket和java.net.ServerSocket API使用的底層實現,易于維護和調試。新的實現很容易適應用戶模式線程,也就是光纖。之前的底層實現可以追溯到jdk1.0,實現是遺留java和c代碼的混合,維護和調試很痛苦,該實現使用線程堆棧作為I/O緩沖區,這種方式需要多次增加默認線程堆棧大小。
  • JDK14(2020-03)
  • switch優化變為最終版
  • gc相關
    1)刪除CMS
    2)棄用 ParallelScavenge + SerialOld GC 的垃圾回收算法組合
    3)將 zgc 垃圾回收器移植到 macOS 和 windows 平臺
  • instanceof 擴展 (preview)
    傳統instanceof使用方法: if (o instanceof String) {String s = (String)o;System.out.println(s.length); }
  • 現在可以增強為:

    if (o instanceof String s) {System.out.println(s.length);}
  • 有幫助的NullPointerException
    傳統出現NullPointerException時的報錯信息:
  • Exception in thread "main" java.lang.NullPointerExceptionat jdk14.NullTest.<init>(NullTest.java:16)at jdk14.Main.main(Main.java:15)

    如果異常信息是鏈式調用時發生,如:a.b.c.d…, 此時很難直接定位NullPointerException發生在哪里。現在打印信息得到了增強:

    Exception in thread "main" java.lang.NullPointerException:Cannot read field "c" because "a.b" is nullat Prog.main(Prog.java:5)
    JDK15(2020-09)
  • JEP 385 Deprecate RMI Activation for Removal
    RMI Activation被標記為Deprecate,將會在未來的版本中刪除(JDK17)。RMI大家應該都清楚,RMI就是Remote Method Invocation,翻譯成中文就是遠程方法調用,是在JDK1.2中引入的。RMI為java提供了開發分布式系統的強大能力。而J2EE的規范EJB就是使用RMI來實現的bean的遠程調用的。在RMI系統中,遠程系統中存在很多分布式對象,如果這些分布式對象一直處于活動狀態的話,將會占用很多寶貴的系統資源。于是RMI引入了一種lazy Activation的方式,這種方式就叫做延遲激活。對于現代應用程序來說,分布式系統大部分都是基于Web的,web服務器已經解決了穿越防火墻,過濾請求,身份驗證和安全性的問題,并且也提供了很多延遲加載的技術。所以在現代應用程序中,RMI Activation已經很少被使用到了。并且在各種開源的代碼庫中,也基本上找不到RMI Activation的使用代碼了。為了減少RMI Activation的維護成本,在JDK8中,RMI Activation被置為可選的。現在在JDK15中,終于可以廢棄了。

  • JEP 339 Edwards-Curve Digital Signature Algorithm (EdDSA)
    實現了EdDSA橢圓曲線簽名算法。

  • JEP 375 Pattern Matching for instanceof (second preview)
    該功能已經在JDK14初次引入,可看上文介紹

  • JEP 384 Records (Second Preview)
    引入了Record類型,解決定義大量get/set方法的問題,可一定程度替代掉lomobok
    示例如下:

  • public record Address(String addressName,String city ) {}public record CustUser(String firstName,String lastName,Address address,int age ) {}

    Record和普通的類的區別就在于Record多了一個括號括起來的定義的字段。
    Record類默認是final的,里面的字段默認是private final的。

    可借助IDE的反編譯功能,反編譯字節碼可得到Record類的實現:

    public final class CustUser extends java.lang.Record {private final java.lang.String firstName;private final java.lang.String lastName;private final com.flydean.records.Address address;private final int age;public CustUser(java.lang.String firstName, java.lang.String lastName, com.flydean.records.Address address, int age) { /* compiled code */ }public java.lang.String toString() { /* compiled code */ }public final int hashCode() { /* compiled code */ }public final boolean equals(java.lang.Object o) { /* compiled code */ }public java.lang.String firstName() { /* compiled code */ }public java.lang.String lastName() { /* compiled code */ }public com.flydean.records.Address address() { /* compiled code */ }public int age() { /* compiled code */ } }

    可以看出Record類繼承自Record類,屬性默認private final,這意味著Record實例是immutable(不可變的), 且有一個默認的包含所有參數的構造方法,其他如toString(), hashCode(), equals()已得到了默認實現。

    對于Record可以做一定限度的定制,如校驗屬性,定義新屬性。

    public record CustUserWithBody(String firstName,String lastName,Address address,int age ) {public String fullName(){return firstName + lastName;}public CustUserWithBody {if (age < 18) {throw new IllegalArgumentException( "年紀太小");}} }
    JDK16(2021-03)
  • instanceof 增強確定為最終版本,該功能已經在JDK14初次引入,可看上文介紹。
  • Records確定為最終版本,該功能同樣也已經歷了兩代預覽版,可看上文介紹。
  • 387: 彈性Metaspace功能可將未使用的HotSpot虛擬機的Class Metadata(Metaspace)占用的內存更迅速的返回給操作系統,從而減少Metaspace的占用并簡化Metaspace的代碼以降低維護成本。
  • 388: 將JDK移植到Windows/AArch64平臺。
  • 392: 提供用于打包獨立的Java應用程序的jpackage工具。
  • JDK17(2021-09, LTS)

    該版本是繼JDK11之后3年新推出的長期支持版本。

  • JDK 內部的強封裝,除了sun.misc.Unsafe等關鍵的內部 API 外,用戶將不再可能通過單個命令行選項來 relax 對內部元素的強封裝,這在 JDK 9 到 JDK 16 中是可行的。該計劃的目標包括提高 JDK 的安全性和可維護性,并鼓勵開發人員從內部元素遷移到標準 API。
  • 刪除遠程方法調用 (RMI) 激活機制,同時保留 RMI 的其余部分。RMI 激活機制已過時和廢棄,在 JDK 15 中不推薦使用(可參考上文JDK15部分的描述)。
  • 刪除實驗性 AOT 和 JIT 編譯器,它們幾乎沒有使用,但需要大量維護工作。該計劃要求維護 Java 級別的 JVM 編譯器接口,以便開發人員可以繼續使用外部構建的編譯器版本進行 JIT 編譯。
  • 將 JDK 移植到 MacOS/AArch64 以響應 Apple 將其 Macintosh 計算機從 x64 轉換到 AArch64 的計劃(Apple M1處理器)。針對 MacOS/AArch64 的更改有可能破壞現有的 Linux/AArch64、Windows/AArch64 和 MacOS/x64 port,但這種風險可通過預集成測試來降低。
  • 棄用 Applet API 以進行刪除。這個 API 本質上是無關緊要的,因為所有 Web 瀏覽器供應商要么已經取消了對 Java 瀏覽器插件的支持,要么已經宣布了這樣做的計劃。Applet API 之前在 2017 年 9 月的 Java 9 中已被棄用,但并未刪除。Applet API徹底被刪除,最早java就是靠applet開始火的。
  • 棄用 Security Manager,準備在未來版本中移除。追溯到 Java 1.0,Security Manager 一直是保護客戶端 Java 代碼的主要手段,很少用于保護服務器端代碼。該提案的一個目標是評估是否需要新的 API 或機制來解決使用 Security Manager 的特定狹窄用例,例如阻塞System::exit。計劃要求棄用 Security Manager 以與舊 Applet API 一起刪除,該 API 也計劃在 JDK 17 中棄用。
  • 總體來說JDK17沒有在語言層面有新的改進。

    JDK18(2022-03, Coming soon)

    OpenJDK vs OracleJDK

    市面上有各種jdk,最權威的是官方發布的oracle jdk,其他的還有adoptopenjdk, azul zulu jdk, Amazon Corretto, alibaba dragonwell, Temurin等。 oracle jdk 和Open jdk有什么區別?為什么又冒出各種各樣的jdk? Oracle jdk從2019年之后需要商業收費,公司該如何選擇?本節將對這些問題做一些澄清。

    OpenJDK可理解為兩個:源代碼存儲庫和發行版本。

    源代碼存儲庫角度: 就源代碼而言,只有一套Java源代碼,存在OpenJDK項目中,地址是:https://github.com/openjdk/jdk。 這個項目由Oracle公司主導,還有很多大公司參與合作開發,如:IBM, Apple, Microsoft等。

    發行版本角度: 各個公司基于同一套源碼,加上一些自己的實用工具,為不同的平臺(os:Linux, Mac, Windows; 架構:aarch64, x64)編譯出二進制包,并附上授權聲明,提供給大家下載使用。 各個不同的發行版本也會承諾如有版本更新也會及時釋出新版本。

    OracleJDK從9開始一樣是基于OpenJDK,它額外的提供了一些閉源組件,以及商用license。可以理解為OracleJDK和OpenJDK源碼幾乎就一樣,使用Oracle JDK需要付費,同時也能得到相應的服務: 客服支持,版本更新以及一些實用工具。

    主流OpenJDK 發行版介紹

    Temurin OpenJDK
    原來是AdoptOpenJDK ,是2017年,一群Java用戶組(JUG)成員、開發者和供應商(包括亞馬遜、微軟、Pivotal、Redhat等)建立了一個社區稱作AdoptOpenJDK。他們提供免費、穩固的OpenJDK build,可用性與更新周期更長。甚至還有兩個不同的Java虛擬機可供選擇:HotSpot和OpenJ9。
    目前它已歸屬于Eclipse 基金會,下載地址:https://adoptium.net/
    該版本是大多數用戶(無特殊功能要求)的最佳選擇。

    Oracle OpenJDK
    oracle自己也基于OpenJDK編譯了一套發行版,去除了商標,并且免費,但不承諾會及時更新。

    Azul Zulu OpenJDK
    官方稱是世界上最大的OpenJDK商用提供商。它自家閉源的zing jvm在hotspot jvm的基礎上進行了大量優化。zulu是Azul提供的開源版本,可自由使用,但不提供支持。 需要支持可選用商業版本:

    商業版本分為兩種:

  • Azul Platform Core
    即之前的zulu enterprise/embedded版本

  • Azul Platform Prime
    即之前的zing。它提供更優秀的性能。

  • zulu是本人比較喜歡的版本。下載地址:https://www.azul.com/downloads/?package=jdk

    Microsoft OpenJDK
    微軟也發行了自己的openJDK版本,且不僅僅是Windows版本, macOS, Linux也有對應釋出版本。果然Microsoft越來越開放了。 按微軟的說法其Azure, SQL Server, Visual Studio Code, LinkedIn等都使用了java技術。

    微軟提供的軟件質量肯定是妥妥的,用于生產都沒什么問題,下載地址:https://www.microsoft.com/openjdk

    Dragonwell OpenJDK
    最后一個介紹一下阿里釋出的發行版,命名為龍井。Alibaba Dragonwell 是一款免費的, 生產就緒型Open JDK 發行版,提供長期支持,包括性能增強和安全修復。阿里巴巴擁有最豐富的Java應用場景,覆蓋電商,金融,物流等眾多領域,世界上最大的Java用戶之一。Alibaba Dragonwell作為Java應用的基石,支撐了阿里經濟體內所有的Java業務。

    阿里生產環境使用的OpenJDK,質量也是經的起考驗,需要注意的是:

  • Alibaba Dragonwell 會針對 Long Term Support(LTS) 提供 Java 8 和 Java 11兩個版本
  • Dragonwell隨阿里云 VM 鏡像發布,免費提供給阿里云客戶使用;開發者也可以直接下載免費使用
  • 阿里巴巴提供季度更新,Java8 更新至少到 2023 年 6月,Java11 更新至少到 2024 年 6月
  • 目前僅支持Linux下的x64架構
  • 下載地址:https://www.aliyun.com/product/dragonwell

    用戶JDK版本選擇
  • 有商業支持需求的選擇Oracle JDK。 如果對性能方面有更高要求的選Azul Platform Prime, 即zing jvm。
  • 免費用戶無特殊要求的選Temurin OpenJDK即可。
  • 有特殊架構需求的,如Mac m1(aarch64)有時釋出版本受限,可選擇zulu OpenJDK。
  • 總結

    以上是生活随笔為你收集整理的1. JDK版本变迁和各版本新特性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。