Java版本历史

自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的任何改动均依据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日发布。新增功能主要包括：
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个类。主要增加包括：
J2SE 1.3.
代号为Kestrel。在版本中最著名的改变包括：
J2SE 1.4.
代号为Merlin。2002年2月6日释出了JSR 59，是第一个在JCP下开发的Java平台。主要的变化包括︰
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增加了若干个重要的新语言功能。
另外也有以下这些对于基本程式库的改善：
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 SE 6.
代号为Mustang。版本发布于2006年12月11日，Sun把原本的名称「J2SE」改为「Java SE」，然后再从版本号中去掉「.0」，而开发者内部编号仍然是1.6.0。这个版本是根据JSR 270开发的。
在发展阶段，新版本大约每一周都会释出一些功能增强和漏洞的修复。Beta版本在2006年2月和6月释出，也就是为什么2006年12月11日变成最终的版本。
本版本包含的主要更改：
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个版本（就是一般包括的功能增强和漏洞修复） 。在 OpenJDK 7 专案中的功能清单中列出了很多的改变。
在 Java 7 中新增的功能包括：
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)的指导下得到了整合。
Java 8 不再支援Windows XP，但JDK 8 第 25 版更新仍然可以在 Windows XP安装和运行。先前JDK 8的更新版本可以在XP中运行，但必须通过强制解压安装程序来进行安装。
2014年10月后，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对拟议的模块系统方案达成了共识。
Java 9 的首个发布候选版于2017年8月9日发布，首个稳定版于2017年9月21日发布。
Java SE 10.
OpenJDK 10 于2018年3月20日发布。此次更新包含以下12个新特性：
第一个 JEP，JEP 286 "局部变量类型推断"，允许使用 var 关键字，使编译器推断出局部变量的实际类型。
所以我们可以这样做：
var list = new ArrayList&lt;String&gt;(); // 推断为 ArrayList&lt;String&gt;
var stream = list.stream(); // 推断为 Stream&lt;String&gt;
Java SE 11（LTS）.
JDK 11 于2018年9月25日发布。Java 11 包含如下更新：
Java SE 12.
JDK 12 于2019年3月19日发布。该版本包含较多新特性，例如：
预览功能 JEP 325 扩充了 switch 语句，使它可以用作表达式，并添加了一种新形式的 case 标签，其中右侧是表达式。
不需要break语句。 对于复杂的表达式，可以使用codice_14语句。 这在 Java SE 14 中成为了标准。
int ndays = switch(month) {
 case JAN, MAR, MAY, JUL, AUG, OCT, DEC -&gt; 31;
 case APR, JUN, SEP, NOV -&gt; 30;
 case FEB -&gt; {
 if (year % 400 == 0) yield 29;
 else if (year % 100 == 0) yield 28;
 else if (year % 4 == 0) yield 29;
Java SE 13.
JDK 13 于2019年9月17日发布。该版本包含以下新特性以及很多的强化和很多的漏洞修补。
JEP 355 "文字方块" 允许多行字串文字：
String html = """
 &lt;html lang="en"&gt;
 &lt;body&gt;
 &lt;p&gt;Hello, world&lt;/p&gt;
 &lt;/body&gt;
 &lt;/html&gt;
Java SE 14.
JDK 14 发布于 2020 年 3 月 17 日。Java 14 包含了下方列出的新功能，以及“数百个小改进和数千个漏洞修复”。
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 SE 15.
JDK 15 发布于 2020 年 9 月 15 日。Java 15 增加了对多行字符串字面量（亦称文本块）的支持，此外 Shenandoah 和 ZGC 垃圾收集器也转为生产级别，不再标记为测试中。该版本移除了对 Solaris 操作系统及 SPARC CPU 的支持，还移除了 Nashron JavaScript 引擎，以及一些根 CA 证书。
Java SE 16.
JDK 16 发布于 2021 年 3 月 16 日。Java 16 移除了 AOT 编译及 Graal JIT 的选项。自 Java 16 开始，允许使用 C++14 来编写 Java 的实现（但仍不允许 C++17、C++20 等版本），且代码迁移到了 GitHub，不再使用 Mercurial 版本控制系统。
Java SE 17（LTS）.
JDK 17 发布于2021年9月14日。Java 17是切换到新的6个月发布周期以来的第二个长期支持（LTS）版本（第一个是Java 11）。
JEP 406 将 instanceof 操作中使用的模式匹配语法扩展到 switch 语句和表达式。它允许根据参数类型、null case和精简模式来选择case
String toString(Object o) {
 return switch (o) {
 case null -&gt; "Null";
 case String s -&gt; String.format("字串 %s", s);
 case Long l -&gt; String.format("长整数 %d", l);
 case Double d -&gt; String.format("浮点数 %f", d);
 case Integer i &amp;&amp; i &gt; 0 // 精简模式
 -&gt; String.format("正整数 %d", i);
 case Integer i &amp;&amp; i == 0 
 -&gt; "零整数 0";
 case Integer i &amp;&amp; i &lt; 0 
 -&gt; String.format("负整数 %d", i);
 default -&gt; o.toString();
Java SE 18.
JDK 18 发布于 2022 年 3 月 22 日。
Java SE 19.
JDK 19 发布于 2022 年 9 月 20 日。
JEP 405 允许记录类的模式，扩充 instanceof 运算子和 switch 表达式的模式匹配功能，以包含显式引用记录组件的记录类模式。
int area(Object o) {
 if (o instanceof Rectangle(int x, int y, int w, int h)) {
 return w * h;
 return 0;
此类模式可以包括巢状模式，其中记录类的组件本身就是记录类，从而允许模式匹配更多物件图。
Java SE 20.
JDK 20 发布于 2023 年 3 月 21 日。
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 445 允许main方法位于未命名的类中：
void main() {
 System.out.println("Hello, World!");
而不用：
public class HelloWorld { 
 public static void main(String[] args) { 
 System.out.println("Hello, World!");
Java SE 22.
JDK 22 在 2024 年 3 月 19 日发布。
与 Java 执行绪实作相关的 APIcodice_15已被删除。
Java SE 23.
Java 23 在 2024 年 9 月 17 日发布，其 JEP 如下：
由于功能设计方面的问题，字串模板预览功能在 Java 23 中被移除。
Java SE 24.
Java 24 规格于 2024 年 12 月最终确定，其中 24 个 JEP 被纳入该版本，并于 2025 年 3 月 18 日发布。
Java SE 25（LTS）.
截至 2024 年 12 月，Java 25 的规格尚未最终确定。 Java 25 预定 2025 年 9 月发布。
未来功能.
编辑
实作.
OpenJDK 是一个自由及开放原始码软体实作在Java Platform, Standard Edition (Java SE)。
官方支援的Java 平台是Java SE，它最初由 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 版本中。