Java语言自JDK1.0版本以来经历了许多次更新,也在基本程序库中增加了大量的类别和包。从J2SE 1.4开始,Java语言的变动由 Java Community Process(JCP)管理,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 8 与 Java 11 为目前提供支持的LTS(长期支持)版本;Java 10 是上一个快速发布版本,且已不再被支持。2018年9月,随着 Java 11 的发布,Java 10 自当日起不再被支持。Oracle 将在 2019 年 1 月前为商业用途中的 Java 8 长期支持,而针对非商用的更新将继续提供,直至 2020 年 12 月;此外,AdoptOpenJDK 也为 Java 8 提供免费更新。针对 Java 11 的长期支持将不再由 Oracle 提供,而是改由 OpenJDK 社区的 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 。
JDK 1.1
1997年2月19日发布。新增功能主要包括:
- AWT事件模型大规模重新编制
- 加入了内部类别
- JavaBeans
- JDBC
- RMI
- 能够支持自理的反射能力,在运行时不可能有修改。
- 针对 Microsoft Windows 平台上运作的版本,附带由Symantec为JavaSoft生产的JIT编译器
- 支持国际化和Unicode,该功能源自Taligent
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日发布了JSR 59,是第一个在JCP下开发的Java平台。
主要的变化包括︰
- 语言上的改变assert 关键字 (在 JSR 41 中被指定)程序库的改善,仿照Perl的正则表达式
异常链,允许一个异常来封装原先处于较低级别的异常。支持Internet Protocol version 6 (IPv6)
非阻塞I/O(取名为 Nonblocking Input/Output,NIO)(在 JSR 51 中被指定) - 日志API (在JSR 47中被指定)
- 图像 I/O API来读取和写入图片,支持JPEG、PNG等格式
- 集成了XML解析器和XSLT处理器(JAXP)(指定在JSR 5和JSR 63)
- 集成安全和加密扩展组件(JCE, JSSE, JAAS)
- 内置了Java Web Start (Java Web Start 在2001年3月第一次被发布,作为J2SE 1.3的可选组件)
(指定在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 循环的语法被用特别的语法扩展了,适用于数组或 Iterable,用于迭代每个成员,如基本的
- Collection 类别 (规范在 JSR 201) 改进多线程 Java 程序的运行语义;新的 Java 存储器模型改善了复杂性,有效性和以前的规格性能
- 静态导入
另外也有以下这些对于基本程序库的改善:
自动给RMI产生桩模块
Swing:新的接口外观,叫做synth
异步实用工具 在 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 SE 6
代号为Mustang。版本发布于2006年12月11日,Sun把原本的名称“J2SE”改为“Java SE”,然后再从版本号中去掉“.0”,而开发者内部编号仍然是1.6.0。这个版本是根据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双缓冲(消除模糊区域效果)。
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,增强了最终用户的可用性或固定的漏洞。自2016 年1月,JAVA 6和其它更旧的版本已无法从Oracle下载。
Java SE 7
JAVA 7 (代号Dolphin) 是一个重大的更新,在 2011年7月7日亮相,并在2011年7月28日开放给开发者使用。发展时期被分类成十三的重要阶段,最后一个阶段在2011年6月6日完成。平均来看,每个里程碑各有8个版本(就是一般包括的功能增强和漏洞修复) 。在 OpenJDK 7 项目中的功能清单中列出了很多的改变。
在 Java 7 中新增的功能包括:
- JVM本身对动态语言的支持:新的invokedynamic字节码指令(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 一直是http://java.com的默认下载版本,直到 Java 8 发布。
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
- 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 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 SE 10
OpenJDK 10 于2018年3月20日发布。此次更新包含以下12个新特性:
- JEP 286:局部变量类型推断
- JEP 317:实验性的基于Java的JIT编译器。这是 Linux x64 下 Graal 动态编译器的集成。
- JEP 310:应用程序类级别数据共享
- JEP 322:基于时间的版本命名
- JEP 307:适用于G1的多线程完全垃圾回收
- JEP 304:垃圾回收器接口
- JEP 314:更多的Unicode语言标签扩展
- JEP 319:内置根证书
- JEP 312:线程本地握手
- JEP 316:在可选的内存设备上申请堆内存空间
- JEP 313:删除本地代码头文件生成器javah
- JEP 296:将所有JDK分支集成到同一个版本库中
Java SE 11
JDK 11 于2018年9月25日发布。Java 11 包含如下更新:
- JEP 309:动态类文件常量
- JEP 318:Epsilon:无操作垃圾收集器
- JEP 323:lambda参数的局部变量语法
- JEP 331:低开销堆分析
- JEP 321:HTTP Client
- JEP 332:支持 TLS 1.3
- JEP 328:添加Java飞行记录器(JFR),其用于创建性能分析记录
- JEP 333:添加ZGC(一个可扩展的低延迟垃圾收集器)
- JavaFX、Java EE、CORBA 被移出 JDK
- JEP 335:弃用 Nashorn JavaScript 引擎
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,及时释放已申请但未使用的内存
Java SE 13
- JDK 13 于2019年9月17日发布。该版本包含以下新特性以及很多的强化和很多的漏洞修补。
- JEP-350: 动态 CDS 归档
- JEP-351: ZGC: 取消提交未使用存储器
- JEP-353: 重新实现旧版 Socket API
- JEP-354: Switch 表达式(预览阶段)
- JEP-355: 文本框(预览阶段)
都看到这了,点个赞再走呗……嘿嘿嘿