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 個方面的改進:
特性五: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)局部變量類型推斷(常用)
即只能作為局部變量類型,方法參數,返回類型等不可以。常見示例:
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的方式:
如今可簡化為:
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>""";使用更簡單、更現代的實現替換java.net.Socket和java.net.ServerSocket API使用的底層實現,易于維護和調試。新的實現很容易適應用戶模式線程,也就是光纖。之前的底層實現可以追溯到jdk1.0,實現是遺留java和c代碼的混合,維護和調試很痛苦,該實現使用線程堆棧作為I/O緩沖區,這種方式需要多次增加默認線程堆棧大小。
JDK14(2020-03)
1)刪除CMS
2)棄用 ParallelScavenge + SerialOld GC 的垃圾回收算法組合
3)將 zgc 垃圾回收器移植到 macOS 和 windows 平臺
傳統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時的報錯信息:
如果異常信息是鏈式調用時發生,如: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
示例如下:
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)
JDK17(2021-09, LTS)
該版本是繼JDK11之后3年新推出的長期支持版本。
總體來說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,質量也是經的起考驗,需要注意的是:
下載地址:https://www.aliyun.com/product/dragonwell
用戶JDK版本選擇
總結
以上是生活随笔為你收集整理的1. JDK版本变迁和各版本新特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2626):取消360为首页
- 下一篇: java jsp实验设计心得_jsp课程