自JDK 1.0版本以来,Java語言历经了多次迭代更新,并在基础程式庫中持续增添大量類別与包。自J2SE 1.4版本起,Java语言的演变过程交由 Java Community Process(JCP)统一管理,其采用Java规范请求(Java Specification Requests,简称JSRs)的方式,以建议和确定对Java平台各部分内容的新增与修订工作。Java语言的规则遵循《Java语言规范》(Java Language Specification,简称JLS),针对JLS的任何改动均依据[http://www.jcp.org/en/jsr/detail?id=901 JSR 901]进行规范化管理。
除了語言上的變化,多年來Java标准庫(JCL)发生了巨大的变化,從JDK 1.0中的幾百個類暴增到J2SE 5中的三千多個類。Swing、Java2D等的全新API被加入其中,而許多原本JDK 1.0的類和方法已被弃用。當然,仍然有一些程式可以將Java程式從新版本的Java平台轉換為較舊版本(例如Java 5.0降轉到1.4)。
Java 7發布後,Oracle承諾回到以前每兩年發布一次的發布週期。但在2013年時,Oracle卻宣布他們將Java 8延遲一年發表,官方表示是為了修復Java的安全漏洞。
2017年9月,Java平台的主架构师Mark Reinhold发出提议,要求将Java的功能更新周期从之前的每两年一个新版本缩减到每六个月一个新版本。该提议获得了通过,并在提出后不久生效。
Java 17, 11, 8为目前提供支持的LTS(长期支持)版本;Java 10是上一个快速发布版本,且已不再被支持。2018年9月,随着Java 11的发布,Java 10自当日起不再被支持。Oracle将在2019年1月前为商业用途中的Java 8长期支持,而针对非商用的更新将继续提供,直至2020年12月;此外,AdoptOpenJDK也为Java 8提供免费更新。针对Java 11的长期支持将不再由Oracle提供,而是改由OpenJDK社区提供,例如Eclipse Adoptium(以前称之为AdoptOpenJDK)
JDK Alpha和Beta
第一個1995年發布的alpha和beta Java公開版本,API和ABI非常不穩定。支援Java Web瀏覽器被取名為WebRunner。
JDK 1.0
第一個版本於1996年1月23日發布,叫做為Oak。而真正第一個穩定的版本JDK 1.0.2,被稱作Java 1。
JDK 1.1
1997年2月19日發布。新增功能主要包括:
- AWT事件模型大規模重新編製
- 加入了內部類別
- JavaBeans
- JDBC
- RMI
- 能夠支援自理的反射能力,在運行時不可能有修改。
- 针对Microsoft Windows平台上運作的版本,附带由Symantec為JavaSoft生產的JIT编译器
- 支持国际化和Unicode,该功能源自
J2SE 1.2
1998年12月8日發布,代號為Playground。 该版本到J2SE 5.0為止的後續版本被更名為Java 2,而版本名稱「J2SE」(Java 2平台,標準版)取代JDK以區別J2EE(Java 2平台,企業版) 和J2ME(Java 2 Platform,Micro Edition)基礎平台。這是Java的一個非常重要的版本,它將Java平台的大小增加至原先的三倍,在59個程式包中達到了1520個類。主要增加包括:
- strictfp關鍵字
- 主類別中整合了Swing圖像化API
- 首次为Sun提供的JVM配備JIT编译器
- Java plug-in(即Java Applet)
*Java IDL,一個与CORBA互通的接口描述语言实现
- Java集合框架
J2SE 1.3
代號為Kestrel。在版本中最著名的改變包括:
- 包含了HotSpot JVM(HotSpot JVM第一次被發布是在1999年4月,名為J2SE 1.2 JVM)
- 為了支援與CORBA的選擇相容性而修改了RMI
- Java命名和目錄接口(Java Naming and Directory Interface,縮寫JNDI)包含在主程式庫中(先前為擴充元件的形式)
- Java Platform Debugger Architecture (JPDA)
- JavaSound
- 用于实现动态代理的类
J2SE 1.4
代號為Merlin。2002年2月6日釋出了[http://www.jcp.org/en/jsr/detail?id=59 JSR 59],是第一個在JCP下開發的Java平臺。主要的變化包括︰
- 語言上的改變
** assert關鍵字(在[https://web.archive.org/web/20080616233205/http://www.jcp.org/en/jsr/detail?id=41 JSR 41中被指定)
- 程式庫的改善
** 仿照Perl的正規表示式
** 異常鏈,允許一個异常來封裝原先处于較低級別的异常
** 支援Internet Protocol version 6 (IPv6)
** 非阻塞I/O(取名為Nonblocking Input/Output,NIO)(在 [http://www.jcp.org/en/jsr/detail?id=51 JSR 51]中被指定)
** 日誌API (在[http://www.jcp.org/en/jsr/detail?id=47 JSR 47]中被指定)
** 图像I/O API來读取和寫入图片,支持JPEG、PNG等格式
** 整合了XML解析器和XSLT處理器(JAXP)(指定在[http://www.jcp.org/en/jsr/detail?id=5 JSR 5]和[http://www.jcp.org/en/jsr/detail?id=63 JSR 63])
** 整合安全和加密擴充元件(JCE, JSSE, )
** 内置了Java Web Start(Java Web Start在2001年3月第一次被釋出,作为J2SE 1.3的可选组件)(指定在[http://www.jcp.org/en/jsr/detail?id=56 JSR 56])
** 偏好設定 API (java.util.prefs)
Java 1.4開放支源和安全性更新於2008年10月終止。Oracle客戶的付費的安全性更新也在2013年2月結束。
J2SE 5.0
代號為Tiger。這個在2004年9月30日釋出的版本原本以1.5編號,也就是仍然使用內部版本編號。這個數字輩改變是為了「更好地反映成熟度、穩定性、可擴充性和J2SE的安全水準」。這個版本是在JSR 176底下被開發。
J2SE 5.0在2008年4月8日進入其即將停止公開更新的期間;2009年11月3日正式不公開開放更新。Oracle客戶直到2015年5月都能透過付費的方式取得更新 。
Tiger增加了若干個重要的新語言功能。
- 泛型(Generics):為集合提供編譯期間(靜態)型別安全,且不須為大多數類型轉換(型別轉換)(規範在JSR 14)
- 元資料(Metadata):也稱作注解。讓語言結構(像是類別和方法)能夠用額外的資料標記,可以由元資料意識工具處理(規範在JSR 175)
*自動封裝與解封裝:在基本的資料型別(如int)和基本的的外覆類別(如Integer)之間能夠自動轉換(規範在JSR 201)
- 枚舉(Enumerations):以enum關鍵字創造出一種型別安全,有排序值的清單(如Day.MONDAY、Day.TUESDAY等);以前這只能透過非型別安全的恒定整數或自行撰寫的類別來達成(型別安全的枚舉模式)(規範在JSR 201)
- 可變參數函數(Varargs):方法的最後一個參數現在可以用一個類型名稱加上三個點宣告(如:void drawtext(String... lines));在調用代碼中,型別中參數裡任何的數字可以被使用,而它們再放在一個陣列來傳遞給方法,或是其它的調用代碼可以傳遞那個型別的陣列
- 強化for each迴圈:for迴圈的語法被用特別的語法擴充了,适用于陣列或,用于迭代每個成員,如基本的類別(規範在JSR 201)
- 改進多執行緒Java程式的執行語義;新的Java記憶體模型改善了複雜性、有效性和以前的規格性能
- 静态导入
另外也有以下這些對於基本程式庫的改善:
- 自動給RMI產生桩模块
- Swing:新的介面外觀,叫做synth
- 异步实用工具 在 [http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html java.util.concurrent] 套件中
- Scanner類別來解析來自各式各樣的輸入和緩衝
Java 5是Java的最後一個正式支援Microsoft Windows 98和Windows ME的版本,而Windows Vista是J2SE 5在2009年10月的Java 5生命週期之前支援的Windows的最新版本。
Java 5 Update 5(1.5.0_05)是Java在Windows 95(裝了Internet Explorer 5.5的)和Windows NT 4.0上運行的最後一個版本。
Java 5最初出現在Mac OS X 10.4(Tiger),到了Mac OS X 10.5(Leopard)時成為了預設的Java版本。
版本控制系統的改變
此版本推出了JAVA語言中,一個新的版本控制系統,而舊版本控制系統仍然可以在開發者資源庫中繼續使用。這種對應關係持續維持到以後的版本(Java 6 = JDK 1.6, Java 7 = JDK 1.7,以此類推)。
Java 5 更新
Java SE 6
代號為Mustang。版本發佈於2006年12月11日,Sun把原本的名稱「J2SE」改為「Java SE」,然後再從版本號中去掉「.0」,而開發者內部編號仍然是1.6.0。這個版本是根據[http://www.jcp.org/en/jsr/detail?id=270 JSR 270]開發的。
在發展階段,新版本大約每一周都會釋出一些功能增強和漏洞的修復。Beta版本在2006年2月和6月釋出,也就是為什麼2006年12月11日變成最終的版本。
本版本包含的主要更改:
- 支持舊的Win9x版本下降;非正式地,Java 6 Update 7是Java的最後一個顯示為在這些版本的Windows上工作的版本。 這被認為是因為在Update 10版本中的主要更改。
- 腳本語言支持(Scripting Language Support)(JSR 223):用於與腳本語言緊密整合的通用API,以及內建的Mozilla JavaScript Rhino整合。
- 核心平台和Swing性能顯著的改進。
- 透過JAX-WS改善的網路服務支援(JSR 224).
- 支援JDBC 4.0 (JSR 221).
- Java編譯器API (JSR 199):允許Java程式以寫程式的方式選擇和呼叫Java編譯器的API。
- 將JAXB升級到版本2.0:包括StAX解析器的整合。
- 支持pluggable annotations (JSR 269).
- 改善許多GUI,像是SwingWorker在API中的整合,表格排序和篩選,以及真正的Swing雙緩衝(消除模糊區域效果)。
- 包含JVM改善:同步和編譯器性能優化,新演算法和對現有垃圾收集演算法的升級以及應用程序啟動性能。
Java 6可以安裝到在64位(Core 2 Duo和更高版本)處理器機器上運行的Mac OS X 10.5(Leopard)。 運行Mac OS X 10.6(Snow Leopard)的32位和64位機器也支援Java 6。
Java 6在2013年2月到了它支援生命週期的尾聲,此時所有公開更新(包括安全更新)都計劃停止。 Oracle在2013年3月和4月發布了另外兩個對Java 6的更新,修補了一些安全漏洞。
Java 6 更新
JAVA 6釋出後,Sun和後來的Oracle,釋出了幾個更新,而不更改任何公開的API,增強了終端使用者的可用性或固定的漏洞。Oracle曾声明,自2016 年1月,JAVA 6和其它更舊的版本已無法從Oracle下載;但在此之后,Oracle于其官网重新提供各个旧版本的下载(需要登录Oracle帐户)。
Java SE 7
JAVA 7 (代號Dolphin) 是一個重大的更新,在 2011年7月7日亮相,並在2011年7月28日開放給開發者使用。發展時期被分類成十三个重要階段,最後一個階段在2011年6月6日完成。平均來看,每個里程碑各有8個版本(就是一般包括的功能增強和漏洞修復) 。在 [http://openjdk.java.net/projects/jdk7/features/ OpenJDK 7 專案中的功能清單]中列出了很多的改變。
在 Java 7 中新增的功能包括:
*JVM本身对動態語言的支持:新的invokedynamic字节码指令([http://jcp.org/en/jsr/detail?id=292 JSR-292]),与多語言虛擬機(Multi Language Virtual Machine)原型
- 64位指针压缩(Java 6 中可以使用 XX:+UseCompressedOops 开启)
- 一些語言方面的小改變(在Coin專案下的一個小群體):
:* 在switch中使用字符串类型
:* try语句中的自動資源管理
:* 針對泛型實例的创建而改善的類型推論,被称为钻石操作符<>
:* 簡化了varargs方法的声明
:* 二進位整數字面值
:* 允許在數值字面值中加入下划线
:* 允许在一个 catch 中捕捉多个类型的异常,並使用改進的類型檢查重新抛出异常
- JSR 166下的並發實用工具
- 新的檔案I/O 程式庫 (JSR 203 定義) 增加多重檔案的支援、檔案原始資料和符號鏈接。新的包為:java.nio.file、java.nio.file.attribute和java.nio.file.spi
- 使用 Timsort 來为集合与数组排序,取代归并排序
- 對椭圆曲线加密演算法增加标准库级别的支援
- 一個給Java 2D的XRender傳遞途徑,改進了現代GPUs特有的功能的處理
- 用於圖形功能的新平台API(最初在版本6u10中的實作為不支援的API)
- 增強了對新網路通訊協定(包括SCTP和Sockets Direct Protocol)的标准库级别的支持
- 更新對XML和Unicode的支持,以符合最新标准
- Java部署規則集
Lambda(Java 對匿名函数的實作)、Jigsaw(Java 對模块化的實作),以及其它一些 Coin 项目中的内容在 Java 7 裡被放棄,而转为Java 8一部份(其中 Jigsaw 直至 Java 9 才得到实现)。
從2012年4月開始,Java 7 一直是java.com的預設下載版本,直到 Java 8 发布。
Java 7 更新
Oracle 在每季度發布 Java 7 家族每季的公開更新,至2015年4月產品支援生命週期結束時停止。
Java SE 8
Java 8 於2014年3月18日釋出,包含了一些原本被計畫在 Java 7卻延遲的功能。
这些功能改进在JDK Enhancement Proposals (JEPs)的指导下得到了整合。
- JSR 335,JEP 126:Lambda專案中提供的語言级匿名函数支持(官方称为 lambda 表达式,非官方亦称闭包);添加預設方法(虛擬擴充元件方法),以允許在不破坏兼容性的情况下向现有接口中新增方法。Java社群中曾经有过针对是否要加入 lambda 表达式支援的辯論。稍后Sun公司宣布 lambda 表达式將會包含在Java中,并請社群協助改善该特性。支援lambda表达式使得针对流中元素的函数式操作成为可能,由此可以实现由 MapReduce 啟發的函数式集合操作。預設方法允許API作者添加新的方法到现有介面上,而不會破壞舊的程式碼中。預設方法還使得多重繼承的行為 (不是狀態)成为可能,但默认方法的设计意图并非在此。
- JSR 223,JEP 174:Nashorn專案,一個 JavaScript 運行时,它允許開發人員在應用程式中嵌入 JavaScript 程式碼
- JSR 308,JEP 104:在 Java 型別上的註解
- 无符號整數算術
- JSR 337,JEP 120:重複註解
- JSR 310,JEP 150:日期和時間 API,基于Joda-Time日期时间处理库的实现。
- JEP 178:靜態連結 JNI 程式庫
- JEP 153:执行 JavaFX 應用程式(直接执行 JavaFX 的應用程式的 JAR 包)
- JEP 122:移除了虚拟机内存管理中的永久世代
Java 8 不再支援Windows XP,但JDK 8 第 25 版更新仍然可以在 Windows XP安裝和運行。先前JDK 8的更新版本可以在XP中運行,但必须通过强制解压安装程序来进行安装。
2014年10月后,Java 8 成为官方網站上預設的下載版本。
Java 8 更新
Java SE 9
在2011年的JavaOne中,Oracle討論了一些他們希望在2016年于Java 9中发布的功能。Java 9 应当对千兆级堆拥有更好的支持,同时能够更好地集成本机代码,且拥有新的垃圾收集器G1和能够自我调节的JVM。2016年初,Java 9 的发布被重新定为2017年3月;2017年3月时,发布日期又被拖延至2017年7月;后来又因Java执行委员会对Jigsaw项目实现的分歧而最终定为2017年9月21日,在此期间Oracle回应了部分疑问,并对一些重要的技术问题进行了修正。在2017年6月的最后几天,JCP对拟议的模块系统方案达成了共识。
- JSR 376:在Jigsaw專案中將JDK模組化(参见Java平台模块系统条目)
- JEP 222:jshell:Java Shell(一個 Java 交互式顶层构件)
- JEP 295:AOT编译(通过 Graal VM 实现)
- JEP 268:XML Catalogs
*JEP 266:更多的併發更新。包含响应式流的Java实现,及其部分替代品java.util.concurrent.Flow。
*JEP 193:变量句柄:定义一个标准方法来调用java.util.concurrent.atomic和sun.misc.Unsafe操作的等价物。
*JEP 282:jlink:Java链接器。该工具可以为模块生成一个包含了其所有依赖项的自定义运行时映像,同时允许生成一个包括运行它的JVM的可执行文件,。
*JavaDB被移出JDK
*JEP 263:高DPI图像:自动缩放与尺寸自适应。
Java 9 的首个发布候选版于2017年8月9日发布,首个稳定版于2017年9月21日发布。
Java 9 更新
Java SE 10
OpenJDK 10 于2018年3月20日发布。此次更新包含以下12个新特性:
- JEP 286:局部变量类型推断
- JEP 296:将所有JDK分支整合到同一个版本库中
- JEP 310:应用程序类级别数据共享
- JEP 304:垃圾回收器接口
- JEP 307:适用于G1的多线程完全垃圾回收
- JEP 312:线程本地握手
- JEP 313:删除本地代码头文件生成器javah
- JEP 314:更多的Unicode语言标签扩展
- JEP 316:在可选的内存设备上申请堆内存空间
- JEP 317:实验性的基于Java的JIT编译器。这是 Linux x64 下 Graal 动态编译器的集成。
- JEP 319:内置根证书
- JEP 322:基于时间的版本命名
第一個 JEP,JEP 286 局部变量类型推断,允許使用 var 關鍵字,使編譯器推斷出局部變量的實際類型。
所以我們可以這樣做:
var list = new ArrayList(); // 推斷為 ArrayList
var stream = list.stream(); // 推斷為 Stream
Java 10 更新
Java SE 11(LTS)
JDK 11 于2018年9月25日发布。Java 11 包含如下更新:
- JEP 181:针对嵌套成员的访问控制
- JEP 309:动态类文件常量
- JEP 315:利用 Aarch64 的特有架构改进其上的性能
- JEP 318:Epsilon:无操作垃圾收集器
- JEP 320:移除 Java EE 和 CORBA 模块
- JEP 321:HTTP Client
- JEP 323:lambda参数的局部变量语法
- JEP 324:支持 Curve25519 和 Curve 448 密钥
- JEP 327:Unicode 10
- JEP 328:添加Java飞行记录器(JFR),其用于创建性能分析记录
- JEP 329:ChaCha20 和 Poly1305 加密算法
- JEP 330:运行单文件源码程序
- JEP 331:低开销堆分析
- JEP 332:支持 TLS 1.3
- JEP 333:添加ZGC(一个可扩展的低延迟垃圾收集器)
- JEP 335:弃用 Nashorn JavaScript 引擎
- JEP 336:弃用 Pack200 相关的工具及 API
Java 11 更新
Java SE 12
JDK 12 于2019年3月19日发布。该版本包含较多新特性,例如:
- JEP 189:Shenandoah:一个实验性的低延迟垃圾收集器
- JEP 230:细粒度性能评审套件
- JEP 325:Switch 表达式(预览阶段)
- JEP 334:JVM Constants API
- JEP 340:仅保留一个 AArch64 平台的移植
- JEP 341:默认类数据共享归档
- JEP 344:针对G1,提供可中止的混合垃圾收集
- JEP 346:针对G1,及时释放已申请但未使用的内存
預覽功能 JEP 325 擴充了 switch 語句,使它可以用作表達式,並添加了一種新形式的 case 標籤,其中右側是表達式。
不需要break語句。 對於複雜的表達式,可以使用yield語句。 這在 Java SE 14 中成為了標準。
int ndays = switch(month) {
case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
case APR, JUN, SEP, NOV -> 30;
case FEB -> {
if (year % 400 == 0) yield 29;
else if (year % 100 == 0) yield 28;
else if (year % 4 == 0) yield 29;
else yield 28; }
};
Java 12 更新
Java SE 14
JDK 14 发布于 2020 年 3 月 17 日。Java 14 包含了下方列出的新功能,以及“数百个小改进和数千个漏洞修复”。
- JEP-305:使用 instanceof 的模式匹配(预览)
- JEP-343:打包工具(孵化中)
- JEP-345:在 G1 中,对不均匀的内存访问(NUMA)情况下的内存申请优化
- JEP-349:JFR Event Streaming
- JEP-352:使字节缓冲区能够映射到非易失性存储器上
- JEP-358:有帮助的 NullPointerExceptions
- JEP-359:记录类(预览)
- JEP-361:Switch 表达式(标准)
- JEP-362:弃用 Solaris 和 SPARC 平台上的移植版本
- JEP-363:移除 Concurrent Mark Sweep (CMS) 垃圾收集器
- JEP-364:适用于 macOS 的 ZGC
- JEP-365:适用于 Windows 的 ZGC
- JEP-366:弃用 ParallelScavenge + SerialOld 的垃圾收集器组合
- JEP-367:移除 Pack200 相关的工具及 API
- JEP-368:文本块(第二预览版本)
- JEP-370:外部内存访问 API(孵化中)
JEP 305, 使用 instanceof 的模式匹配 簡化了instanceof測試的常見情況,緊接著進行強制轉換。將
if (obj instanceof String) {
String s = (String) obj;
System.out.println( s.length() );
}
取代為
if (obj instanceof String s) {
System.out.println( s.length() );
}
JEP 359 记录类 允許輕鬆創建簡單的不可變多元组類。
Java 14 更新
Java SE 15
JDK 15 发布于 2020 年 9 月 15 日。Java 15 增加了对多行字符串字面量(亦称文本块)的支持,此外 Shenandoah 和 ZGC 垃圾收集器也转为生产级别,不再标记为测试中。该版本移除了对 Solaris 操作系统及 SPARC CPU 的支持,还移除了 Nashron JavaScript 引擎,以及一些根 CA 证书。
- JEP 339:爱德华曲线数字签名算法 (EdDSA)
- JEP 360:密封类(预览)
- JEP 371:隐藏类
- JEP 372:移除 Nashorn JavaScript 引擎
- JEP 373:重新实现 DatagramSocket API
- JEP 374:禁用并弃用偏向锁
- JEP 375:使用 instanceof 的模式匹配(第二预览版本)
- JEP 377:ZGC: 可伸缩的低延迟垃圾收集器
- JEP 378:文本块
- JEP 379:Shenandoah: 低暂停时间的垃圾收集器
- JEP 381:移除 Solaris 和 SPARC 平台上的移植版本
- JEP 383:外部内存访问 API(第二孵化版本)
- JEP 384:记录类(第二预览)
- JEP 385:弃用 RMI Activation 以待后续移除
Java 15 更新
Java SE 16
JDK 16 发布于 2021 年 3 月 16 日。Java 16 移除了 AOT 编译及 Graal JIT 的选项。自 Java 16 开始,允许使用 C++14 来编写 Java 的实现(但仍不允许 C++17、C++20 等版本),且代码迁移到了 GitHub,不再使用 Mercurial 版本控制系统。
- JEP 338:Vector API(孵化)
- JEP 347:启用 C++14 语言特性
- JEP 357:从 Mercurial 迁移到 Git
- JEP 369:迁移到 GitHub
- JEP 376:ZGC: 并发的线程栈处理
- JEP 380:用于 Unix 域套接字的 Channel
- JEP 386:Alpine Linux 的移植版本
- JEP 387:可伸缩的 Metaspace
- JEP 388:Windows/AArch64 的移植版本
- JEP 389:外部链接器 API(孵化)
- JEP 390:对值类型的类(Value-based Classes)发出警告
- JEP 392:打包工具
- JEP 393:外部内存访问 API(第三孵化版本)
- JEP 394:使用 instanceof 的模式匹配
- JEP 395:记录类
- JEP 396:在缺省情况下对 JDK 内部进行强封装
- JEP 397:密封类(第二预览版本)
Java 16 更新
Java SE 17(LTS)
JDK 17 发布于2021年9月14日。Java 17是切换到新的6个月发布周期以来的第二个长期支持(LTS)版本(第一个是Java 11)。
- JEP 306:将浮点数的默认语义恢复为严格的
- JEP 356:加强的伪随机数生成器
- JEP 382:新的 macOS 渲染管线
- JEP 391:macOS/AArch64 的移植版本
- JEP 398:弃用 Applet API 以待后续移除
- JEP 403:对 JDK 内部进行强封装
- JEP 406:使用 switch 的模式匹配(预览)
- JEP 407:移除 RMI Activation
- JEP 409:密封类
- JEP 410:移除实验性的 AOT 与 JIT 编译器
- JEP 411:弃用安全管理器以待后续移除
- JEP 412:外部函数与内存 API(预览)
- JEP 414:Vector API(第二孵化版本)
- JEP 415:限定上下文的反序列化过滤器
JEP 406 將 instanceof 操作中使用的模式匹配語法擴展到 switch 語句和表達式。它允許根據參數類型、null case和精簡模式來選擇case
String toString(Object o) {
return switch (o) {
case null -> "Null";
case String s -> String.format("字串 %s", s);
case Long l -> String.format("長整數 %d", l);
case Double d -> String.format("浮點數 %f", d);
case Integer i && i > 0 // 精簡模式
-> String.format("正整數 %d", i);
case Integer i && i == 0
-> "零整數 0";
case Integer i && i String.format("負整數 %d", i);
default -> o.toString();
};
}
Java 17 更新
Java SE 18
JDK 18 发布于 2022 年 3 月 22 日。
- JEP 400:默认使用 UTF-8
- JEP 408:简易 Web 服务器
- JEP 413:Java API 文档中的代码片段
- JEP 416:使用 Method Handle 重新实现核心反射
- JEP 417:Vector API(第三孵化版本)
- JEP 418:因特网地址解析 SPI
- JEP 419:外部函数与内存 API(第二预览版本)
- JEP 420:使用 switch 的模式匹配(第二预览版本)
- JEP 421:弃用 Finalization 以待后续移除
Java 18 更新
Java SE 19
JDK 19 发布于 2022 年 9 月 20 日。
- JEP 405:记录类的模式(预览)
- JEP 422:Linux/RISC-V 的移植版本
- JEP 424:外部函数与内存 API(预览)
- JEP 425:虚拟线程(预览)
- JEP 426:Vector API(第四孵化版本)
- JEP 427:使用 switch 的模式匹配(第三预览版本)
- JEP 428:结构化并发(孵化)
JEP 405 允許記錄類的模式,擴充 instanceof 運算子和 switch 表達式的模式匹配功能,以包含顯式引用記錄組件的記錄類模式。
record Rectangle(int x, int y, int w, int h) {}
int area(Object o) {
if (o instanceof Rectangle(int x, int y, int w, int h)) {
return w * h;
}
return 0;
}
此類模式可以包括巢狀模式,其中記錄類的組件本身就是記錄類,從而允許模式匹配更多物件圖。
Java 19 更新
Java SE 20
JDK 20 发布于 2023 年 3 月 21 日。
- JEP 429:作用域值(孵化)
- JEP 432:记录类的模式(第二预览版本)
- JEP 433:使用 switch 的模式匹配(第四预览版本)
- JEP 434:外部函数与内存 API(第二预览版本)
- JEP 436:虚拟线程(第二预览版本)
- JEP 437:结构化并发(第二孵化版本)
- JEP 438:Vector API(第五孵化版本)
Java 20 更新
Java SE 21(LTS)
JDK 21 在 2023 年 9 月 19 日发布。與僅預覽和孵化 JEP 的 Java 20 相比,Java 21 有 8 個 JEP 不是處於預覽或孵化狀態。Java 21 正式引入了在 Java 17 和 Java 19 中首次預覽的功能(使用 switch 的模式匹配,和記錄類的模式)。 x86 上的 32 位 Windows 版本已棄用並刪除。
- JEP 430:字串範本(預覽)
- JEP 431:有序的 Collections
- JEP 439:世代 ZGC
- JEP 440:記錄類的模式
- JEP 441:使用 switch 的模式匹配
- JEP 442:外部函数與記憶體 API(第三預覽版本)
- JEP 443:未命名模式和變數(預覽)
- JEP 444:虛擬執行緒
- JEP 445:未命名的類別和實例 main 方法(預覽)
- JEP 446:作用域值(預覽)
- JEP 448:Vector API(第六孵化版本)
- JEP 449:棄用 Windows 32 位 x86 端口以待後續移除
- JEP 451:準備禁止動態加載代理
- JEP 452:密鑰封裝機制 API
- JEP 453:結構化並發(預覽)
JEP 445 允許main方法位於未命名的類中:
void main() {
System.out.println("Hello, World!");
}
而不用:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Java 21 更新
Java SE 22
JDK 22 在 2024 年 3 月 19 日發布。
- JEP 423:Region Pinning for G1
- JEP 447:在super()前的語句(預覽)
- JEP 454:外部函數和記憶體API
- JEP 456:未命名模式和變數
- JEP 457:類別檔案API
- JEP 458:啟動多個原始碼檔案程式
- JEP 459:字串範本(第二預覽版本)
- JEP 460:Vector API(第七孵化版本)
- JEP 461:Stream Gatherers(預覽)
- JEP 462:結構化並發(第二預覽版本)
- JEP 463:未命名的類別和實例 main 方法(第二預覽版本)
- JEP 464:作用域值(第二預覽版本)
與 Java 執行緒實作相關的 APIjava.lang.Thread.countStackFrames已被刪除。
Java SE 23
Java 23 在 2024 年 9 月 17 日發布,其 JEP 如下:
- JEP 455:模式中的原始類型、instanceof 和 switch(預覽)
- JEP 466:類別檔案 API(第二個預覽版)
- JEP 467:Markdown 文件註釋
- JEP 469:Vector API(第八個孵化器)
- JEP 473:串流收集器(第二預覽版)
- JEP 471:棄用 sun.misc.Unsafe 中的記憶體存取方法並將其刪除
- JEP 474:ZGC:預設的分代模式
- JEP 476:模組導入聲明(預覽)
- JEP 477:隱式宣告的類別和實例主要方法(第三次預覽)
- JEP 480:結構化並發(第三次預覽)
- JEP 481:作用域值(第三次預覽)
- JEP 482:靈活的建構子主體(第二次預覽)
由於功能設計方面的問題,字串模板預覽功能在 Java 23 中被移除。
Java SE 24
Java 24 規格於 2024 年 12 月最終確定,其中 24 個 JEP 被納入該版本,並於 2025 年 3 月 18 日發布。
- JEP 404:分代 Shenandoah(實驗性)
- JEP 450:緊湊物件頭(實驗性)(以前稱為Lilliput 專案)
- JEP 472:準備限制 JNI 的使用
- JEP 475:G1 的後期屏障擴展
- JEP 478:金鑰派生函數 API(預覽版)
- JEP 479:刪除 Windows 32 位元 x86 端口
- JEP 483:提前類別載入與連結
- JEP 484:類別檔案 API
- JEP 485:流收集器
- JEP 486:永久停用安全管理器
- JEP 487:作用域值(第四個預覽版)
- JEP 488:模式中的原始類型、instanceof 和 switch(第二個預覽)
- JEP 489:Vector API(第九個孵化器)
- JEP 490:ZGC:刪除非分代模式
- JEP 491:無需固定即可同步虛擬線程
- JEP 492:靈活的建構子主體(第三次預覽)
- JEP 493:不使用 JMOD 連結執行時間映像
- JEP 494:模組導入聲明(第二次預覽)
- JEP 495:簡單原始檔案和實例主要方法(第四個預覽版)
- JEP 496:基於抗量子模組格的金鑰封裝機制
- JEP 497:基於模組格的抗量子數位簽章演算法
- JEP 498:在 sun.misc.Unsafe 中使用記憶體存取方法時發出警告
- JEP 499:結構化並發(第四個預覽版)
- JEP 501:棄用並刪除 32 位元 x86 端口
Java SE 25(LTS)
Java 25 在 2025 年 9 月 16 日發布,其 JEP 如下:
- JEP 470:密碼物件 PEM 編碼(預覽)
- JEP 502:穩定值(預覽)
- JEP 503:移除 32 位元 x86 埠
- JEP 505:結構化並發(第五次預覽)
- JEP 506:作用域值
- JEP 507:模式中的原始類型、instanceof 和 switch(第三次預覽)
- JEP 508:Vector API(第十孵化版本)
- JEP 509:JFR CPU-Time Profiling (Experimental)
- JEP 510:金鑰衍生函式 API
- JEP 511:模組匯入宣告
- JEP 512:簡單原始檔案和實例主要方法
- JEP 513:靈活的建構子主體
- JEP 514:Ahead-of-Time Command-Line Ergonomics
- JEP 515:Ahead-of-Time Method Profiling
- JEP 518:JFR Cooperative Sampling
- JEP 519:縮減物件標頭
- JEP 520:JFR 方法測量時間與追蹤
- JEP 521:分代 Shenandoah
未來功能
- Valhalla 項目:值類,其物件缺乏身份,但在某些情況下可以獲得改進的記憶體佈局(較少的間接性),或完全優化其分配。
- 巴拿馬計畫:
** 改進了與本機程式碼的互通性,使Java原始程式碼能夠以比現在更簡單且效能更好的方式呼叫其他語言的函數和使用其他語言的資料類型(Project Panama 的這一部分在Java 22中的JEP 454:外部函數和記憶體API下逐漸穩定)。
** Vector API,一個用於SIMD程式設計的可移植且相對低階的抽象層。其穩定性依賴於Valhalla項目。
- Lilliput專案:減少Java物件頭的大小。首先減少到64位,然後減少到32位。
*減少JIT模式下的啟動時間和預熱時間(達到峰值效能的時間):
**CRaC專案可以對整個JVM(以及正在運行的應用程式)進行快照,並透過必要的調整(重新開啟檔案、套接字等)進行還原。
**除其他事項外,萊頓專案將允許部分或(長期)全部AOT編譯,降低整體動態性(透過採用所謂的「封閉世界約束」)以減少動態編譯開銷。
*Babylon專案旨在透過增強Java語言的反射式程式設計能力(即程式碼反射,即對程式碼本身的反射),將Java語言的適用範圍擴展到其他程式設計模型。其主要目標是在GPU上執行Java程式碼,SQL和其他程式設計模型則作為次要目標。
實作
OpenJDK是一個自由及開放原始碼軟體實作在Java Platform, Standard Edition (Java SE)。
官方支援的Java平台是JavaSE,它最初由Sun開發,現在由Oracle管理。發行版基於OpenJDK項目,這是一個具有開放開發模型的免費開源專案。然而,也存在其他Java實作—部分原因是Java早期是專有軟體。相反,一些實現是為了提供優於標準實現的優勢而創建的,這些實現通常是某些學術或公司贊助的研究領域的成果。許多Linux發行版都包含透過Red Hat啟動的IcedTea專案所建構的OpenJDK,它提供了更直接的建置和整合環境。
Visual J++和Microsoft Java 虛擬機器最初是作為不相容的實作而創建的。在Sun v. Microsoft案之後,Microsoft 放棄了它,並開始著手開發.NET平台。2021年,Microsoft開始發布與Java 11相容的“Microsoft Build of OpenJDK”,之後又陸續發布了與Java 17相容的版本。這些版本不僅支援Windows,還支援Linux和macOS。
還有其他專有Java實作可用,例如Azul的Zing。Azul在Zulu名稱下提供經過認證的開源OpenJDK版本。
在OpenJDK發布之前,Sun的實作仍是專有的,而GNU Classpath專案則是為了提供Java平台的免費開源實作而創建的。自JDK 7發布以來,當OpenJDK成為官方參考實作時,GNU Classpath專案的最初動機幾乎完全消失了,其最後一次發布是在2012年。
Apache Harmony專案在OpenJDK發布前不久啟動。在Sun發布初始原始碼後,Harmony專案繼續運行,致力於提供基於寬鬆許可證(與OpenJDK選擇的保護性許可證不同)的實作。谷歌後來開發了Android,並以寬鬆許可證發布。Android整合了Harmony專案的部分內容,並補充了Google自己的Dalvik虛擬機器和ART。Apache Harmony現已退役,Google已將其Harmony元件替換為OpenJDK中的等效元件。
Jikes和Jikes RVM都是IBM開發的開源研究專案。
還有一些其他實作最初是專有軟體,但現在是開源的。IBM最初將OpenJ9開發為專有的J9,但後來重新授權了該專案並將其捐贈給了Eclipse基金會。JRockit是專有實現,被Oracle收購並納入了後續的OpenJDK版本中。
參考文獻
外部連結
- [http://www.oracle.com/technetwork/java/javase/downloads/index.html 官方 Java SE 下載]
- [http://www.agocg.ac.uk/brief/java.htm Java早期版本]
- [https://web.archive.org/web/20110318063805/http://download.oracle.com/javase/1.3/docs/relnotes/features.html Full list of changes for J2SE 1.3]
- [https://web.archive.org/web/20110317073530/http://download.oracle.com/javase/1.4.2/docs/relnotes/features.html Full list of changes for J2SE 1.4]
- [http://download.oracle.com/javase/1.5.0/docs/relnotes/features.html Full list of changes for J2SE 5.0]
- [http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-429209.html Java SE 7 release notes]
- [http://www.oracle.com/technetwork/java/eol-135779.html Sun Java Supported versions and EOL]
- [http://www.oracle.com/technetwork/java/archive-139210.html 下載Java舊版本的封存檔]
评论 (0)