Java/JDK各版本主要特性汇总

时间:2022-12-08 22:09:40

  1. 将 UTF-8 指定为标准 Java API 的默认字符集
  2. 提供支持静态文件的最小 Web 服务器命令行工具jwebserver
  3. 定义了一个全新的 SPI(service-provider interface),用于主要名称和地址的解析
  4. 弃用 Finalization

Java17(2021.9)(LTS版本)

  1. Free Java License
  2. JDK 17 将取代 JDK 11 成为下一个长期支持版本
  3. Spring 6 和 Spring Boot 3需要JDK17
  4. 移除实验性的 AOT 和 JIT 编译器
  5. 恢复始终执行严格模式 (Always-Strict) 的浮点定义
  6. 正式引入密封类sealed class,限制抽象类的实现
  7. 统一日志异步刷新,先将日志写入缓存,然后再异步刷新

虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善。

Java16(2021.3)

  1. 允许在 JDK C ++源代码中使用 C ++ 14功能
  2. ZGC性能优化,去掉ZGC线程堆栈处理从安全点到并发阶段
  3. 增加 Unix 域套接字通道
  4. 弹性元空间能力
  5. 提供用于打包独立 Java 应用程序的 jpackage 工具

JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入,如instanceof模式匹配(Pattern matching)、record的引入等最终到JDK16变成了final版本。

Java15(2020.9)

  1. EdDSA 数字签名算法
  2. Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用。
  3. Hidden Classes(隐藏类)
  4. 移除 Nashorn JavaScript引擎
  5. 改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现

Java14(2020.3)

  1. instanceof模式匹配,instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量
  2. 引入Record类型,类似于Lombok 的@Data注解,可以向Lombok一样自动生成构造器、equals、getter等方法;
  3. Switch 表达式-标准化
  4. 改进 NullPointerExceptions提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
  5. 删除 CMS 垃圾回收器

Java13(2019.9)

  1. Switch 表达式扩展(引入 yield 关键字);switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break。
  2. 文本块升级 """;引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符。
  3. SocketAPI 重构;(Socket的底层实现优化,引入了NIO)
  4. FileSystems.newFileSystem新方法
  5. 增强 ZGC 释放未使用内存;(ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统。)

重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO。

Java12(2019.3)

  1. Switch 表达式扩展,可以有返回值
  2. 新增NumberFormat对复杂数字的格式化
  3. 字符串支持transform、indent操作
  4. 新增方法Files.mismatch(Path, Path)
  5. Teeing Collector
  6. 支持unicode 11
  7. Shenandoah GC,新增的GC算法
  8. G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率

重要特性:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法。

Java11(2018.9)(LTS版本)

  1. 增加一些符串处理方法
  2. 用于 Lambda 参数的局部变量语法
  3. Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
  4. 可运行单一Java源码文件,如:java Test.java
  5. ZGC:可伸缩低延迟垃圾收集器,(ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收))
  6. 支持 TLS 1.3 协议
  7. Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
  8. 对Stream、Optional、集合API进行增强

重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器。

Java10(2018.3)

  1. 局部变量类型推断,(类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型)
  2. 不可变集合的改进
  3. 并行全垃圾回收器 G1,来优化G1的延迟
  4. 线程本地握手,(允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程)
  5. Optional新增orElseThrow()方法
  6. 类数据共享
  7. Unicode 语言标签扩展
  8. 根证书

重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间。

Java9(2017.9)

  1. 模块化
  2. 提供了List.of()、Set.of()、Map.of() 和 Map.ofEntries() 等工厂方法
  3. 接口支持私有方法
  4. Optional 类改进
  5. 多版本兼容Jar包
  6. JShell工具
  7. try-with-resources的改进
  8. Stream API的改进
  9. 设置G1为JVM默认垃圾收集器
  10. 支持http2.0和websocket的API

重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器。

Java8(2014.3)(LTS版本)

  1. lambada表达式
  2. 函数式接口
  3. 方法引用
  4. 默认方法
  5. Stream API 对元素流进行函数式操作
  6. Optional 解决NullPointerException
  7. Date Time API
  8. 重复注解 @Repeatable
  9. Base64
  10. 使用元空间Metaspace代替持久代(PermGen space)

Java7(2011.7)(LTS版本)

  1. switch 支持String字符串类型
  2. try-with-resources,资源自动关闭
  3. 整数类型能够用二进制来表示
  4. 数字常量支持下划线
  5. 泛型实例化类型自动推断,即”<>”
  6. catch捕获多个异常类型,用(|)分隔开
  7. 全新的NIO2.0 API
  8. Fork/join 并行执行任务的框架

Java6(2006)

  1. java.awt新增Desktop类和SystemTray类
  2. 使用JAXB2来实现对象与XML之间的映射
  3. 轻量级 Http Server API
  4. 插入式注解处理API(lombok使用该特性来实现的)
  5. STAX,处理XML文档的API
  6. Compiler API
  7. 对脚本语言的支持(ruby, groovy, javascript)

Java 5(2004)

  1. 泛型(本质是参数化类型,解决不确定具体对象类型的问题)
  2. 增强的for循环(for-each)
  3. 自动装箱和自动拆箱(包装类型有:Integer,Double,Float,Long,Short,Character和Boolean)
  4. 类型安全的枚举(enum)
  5. 可变长度参数
  6. 静态引入(import static)
  7. 元数据(注解)
  8. 线程并发库(java.util.concurrent)

java1.4(2004)

  1. XML解析器
  2. Java打印服务
  3. Logging API(日志功能)
  4. Java Web Start
  5. JDBC 3.0 API(jdbc高级)
  6. 断言
  7. Preferences API
  8. 链式异常处理
  9. 支持IPV6
  10. 支持正则表达式
  11. 引入Imgae I/O API (图片流);
  12. NIO(高级流)
  13. XSLT转换器

java1.3 (2000)

  1. Timer API(时间)
  2. Java Sound API(声音)
  3. RMI通信协议
  4. jar文件索引
  5. 优化和增强

java1.2 (1998)

  1. J2SE/J2EE/J2ME
  2. EJB
  3. Java IDL(平台对象请求代理体系结构)
  4. 集合框架
  5. JIT(Just In Time)编译器
  6. 数字签名
  7. JFC(Java Foundation Classes), 包括Swing1.0, 拖放和Java2D类库
  8. Java Plug-In(运行插件)
  9. JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型
  10. Applet中添加声音支持
  11. 字符串常量做内存映射
  12. 控制授权/访问系统资源的策略工具

java1.1 (1997)

  1. JAR
  2. JDBC
  3. JavaBean
  4. RMI(远程调用)
  5. Inner Class(内部类)
  6. Reflection(反射)

java1.0 (1996 初代版本)

  1. Classic VM(虚拟机)
  2. Applet(java小应用程序)
  3. AWT(java图形设计)

下图是 Oracle 官方给出的 Oracle JDK 支持的时间线。
LTS:是 Long Term Support,Oracle官宣可以免费商用的LTS版本,也就是官方保证会长期支持的版本。

Java/JDK各版本主要特性汇总

参考链接:
https://blog.oxings.com/article/31.html
https://mp.weixin.qq.com/s/YPJ-sfx04-fOGt4WuPDwIQ