Java/JDK各版本主要特性汇总
- Java18(2022.3)
 - Java17(2021.9)(LTS版本)
 - Java16(2021.3)
 - Java15(2020.9)
 - Java14(2020.3)
 - Java13(2019.9)
 - Java12(2019.3)
 - Java11(2018.9)(LTS版本)
 - Java10(2018.3)
 - Java9(2017.9)
 - Java8(2014.3)(LTS版本)
 - Java7(2011.7)(LTS版本)
 - Java6(2006)
 - Java 5(2004)
 - java1.4(2004)
 - java1.3 (2000)
 - java1.2 (1998)
 - java1.1 (1997)
 - java1.0 (1996 初代版本)
 
Java18(2022.3)
- 将 UTF-8 指定为标准 Java API 的默认字符集
 - 提供支持静态文件的最小 Web 服务器命令行工具jwebserver
 - 定义了一个全新的 SPI(service-provider interface),用于主要名称和地址的解析
 - 弃用 Finalization
 
Java17(2021.9)(LTS版本)
- Free Java License
 - JDK 17 将取代 JDK 11 成为下一个长期支持版本
 - Spring 6 和 Spring Boot 3需要JDK17
 - 移除实验性的 AOT 和 JIT 编译器
 - 恢复始终执行严格模式 (Always-Strict) 的浮点定义
 - 正式引入密封类sealed class,限制抽象类的实现
 - 统一日志异步刷新,先将日志写入缓存,然后再异步刷新
 
虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善。
Java16(2021.3)
- 允许在 JDK C ++源代码中使用 C ++ 14功能
 - ZGC性能优化,去掉ZGC线程堆栈处理从安全点到并发阶段
 - 增加 Unix 域套接字通道
 - 弹性元空间能力
 - 提供用于打包独立 Java 应用程序的 jpackage 工具
 
JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入,如instanceof模式匹配(Pattern matching)、record的引入等最终到JDK16变成了final版本。
Java15(2020.9)
- EdDSA 数字签名算法
 - Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用。
 - Hidden Classes(隐藏类)
 - 移除 Nashorn JavaScript引擎
 - 改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现
 
Java14(2020.3)
- instanceof模式匹配,instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量
 - 引入Record类型,类似于Lombok 的@Data注解,可以向Lombok一样自动生成构造器、equals、getter等方法;
 - Switch 表达式-标准化
 - 改进 NullPointerExceptions提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
 - 删除 CMS 垃圾回收器
 
Java13(2019.9)
- Switch 表达式扩展(引入 yield 关键字);switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break。
 - 文本块升级 """;引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符。
 - SocketAPI 重构;(Socket的底层实现优化,引入了NIO)
 - FileSystems.newFileSystem新方法
 - 增强 ZGC 释放未使用内存;(ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统。)
 
重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO。
Java12(2019.3)
- Switch 表达式扩展,可以有返回值
 - 新增NumberFormat对复杂数字的格式化
 - 字符串支持transform、indent操作
 - 新增方法Files.mismatch(Path, Path)
 - Teeing Collector
 - 支持unicode 11
 - Shenandoah GC,新增的GC算法
 - G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率
 
重要特性:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法。
Java11(2018.9)(LTS版本)
- 增加一些符串处理方法
 - 用于 Lambda 参数的局部变量语法
 - Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
 - 可运行单一Java源码文件,如:java Test.java
 - ZGC:可伸缩低延迟垃圾收集器,(ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收))
 - 支持 TLS 1.3 协议
 - Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
 - 对Stream、Optional、集合API进行增强
 
重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器。
Java10(2018.3)
- 局部变量类型推断,(类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型)
 - 不可变集合的改进
 - 并行全垃圾回收器 G1,来优化G1的延迟
 - 线程本地握手,(允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程)
 - Optional新增orElseThrow()方法
 - 类数据共享
 - Unicode 语言标签扩展
 - 根证书
 
重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间。
Java9(2017.9)
- 模块化
 - 提供了List.of()、Set.of()、Map.of() 和 Map.ofEntries() 等工厂方法
 - 接口支持私有方法
 - Optional 类改进
 - 多版本兼容Jar包
 - JShell工具
 - try-with-resources的改进
 - Stream API的改进
 - 设置G1为JVM默认垃圾收集器
 - 支持http2.0和websocket的API
 
重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器。
Java8(2014.3)(LTS版本)
- lambada表达式
 - 函数式接口
 - 方法引用
 - 默认方法
 - Stream API 对元素流进行函数式操作
 - Optional 解决NullPointerException
 - Date Time API
 - 重复注解 @Repeatable
 - Base64
 - 使用元空间Metaspace代替持久代(PermGen space)
 
Java7(2011.7)(LTS版本)
- switch 支持String字符串类型
 - try-with-resources,资源自动关闭
 - 整数类型能够用二进制来表示
 - 数字常量支持下划线
 - 泛型实例化类型自动推断,即”<>”
 - catch捕获多个异常类型,用(|)分隔开
 - 全新的NIO2.0 API
 - Fork/join 并行执行任务的框架
 
Java6(2006)
- java.awt新增Desktop类和SystemTray类
 - 使用JAXB2来实现对象与XML之间的映射
 - 轻量级 Http Server API
 - 插入式注解处理API(lombok使用该特性来实现的)
 - STAX,处理XML文档的API
 - Compiler API
 - 对脚本语言的支持(ruby, groovy, javascript)
 
Java 5(2004)
- 泛型(本质是参数化类型,解决不确定具体对象类型的问题)
 - 增强的for循环(for-each)
 - 自动装箱和自动拆箱(包装类型有:Integer,Double,Float,Long,Short,Character和Boolean)
 - 类型安全的枚举(enum)
 - 可变长度参数
 - 静态引入(import static)
 - 元数据(注解)
 - 线程并发库(java.util.concurrent)
 
java1.4(2004)
- XML解析器
 - Java打印服务
 - Logging API(日志功能)
 - Java Web Start
 - JDBC 3.0 API(jdbc高级)
 - 断言
 - Preferences API
 - 链式异常处理
 - 支持IPV6
 - 支持正则表达式
 - 引入Imgae I/O API (图片流);
 - NIO(高级流)
 - XSLT转换器
 
java1.3 (2000)
- Timer API(时间)
 - Java Sound API(声音)
 - RMI通信协议
 - jar文件索引
 - 优化和增强
 
java1.2 (1998)
- J2SE/J2EE/J2ME
 - EJB
 - Java IDL(平台对象请求代理体系结构)
 - 集合框架
 - JIT(Just In Time)编译器
 - 数字签名
 - JFC(Java Foundation Classes), 包括Swing1.0, 拖放和Java2D类库
 - Java Plug-In(运行插件)
 - JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型
 - Applet中添加声音支持
 - 字符串常量做内存映射
 - 控制授权/访问系统资源的策略工具
 
java1.1 (1997)
- JAR
 - JDBC
 - JavaBean
 - RMI(远程调用)
 - Inner Class(内部类)
 - Reflection(反射)
 
java1.0 (1996 初代版本)
- Classic VM(虚拟机)
 - Applet(java小应用程序)
 - AWT(java图形设计)
 
下图是 Oracle 官方给出的 Oracle JDK 支持的时间线。
LTS:是 Long Term Support,Oracle官宣可以免费商用的LTS版本,也就是官方保证会长期支持的版本。

参考链接:
https://blog.oxings.com/article/31.html
https://mp.weixin.qq.com/s/YPJ-sfx04-fOGt4WuPDwIQ
Java/JDK各版本主要特性汇总的更多相关文章
- Java JDK 版本的区别
		
jdk6和jdk5相比的新特性有: 1.instrumentation 在 Java SE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument.本地代码 ...
 - 如何在官网下载java JDK的历史版本
		
如何在官网下载java JDK的历史版本 http://jingyan.baidu.com/article/9989c746064d46f648ecfe9a.html 如何在官网下载java JDK的 ...
 - 问题002:我们要使用的Java是哪个版本的?什么是JVM、JRE、JDK、IDE、API?
		
三个版本:1.java SE 标准版 2.java EE企业版 3.Java ME 小型版本 JVM (java virtual machine) java虚拟机 JRE(java runtime e ...
 - 在CentOS 7/6.5/6.4 中安装Java JDK 8(转载)
		
转载在CentOS 7/6.5/6.4 中安装Java JDK 8 首先,在你的服务器上运行一下更新. yum update 然后,在您的系统上搜索,任何版本的已安装的JDK组件. rpm -qa | ...
 - Linux(Centos)之安装Java JDK及注意事项
		
1.准备工作 a.因为Java JDK区分32位和64位系统,所以在安装之前必须先要判断以下我们的Centos系统为多少位系统,命令如下: uname -a 解释:如果有x86_64就是64位的,没有 ...
 - JDK各个版本的新特性jdk1.5-jdk8
		
JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...
 - Java  JDK配置环境变量
		
JDK的配置环境变量. 1.下载JDK,然后安装(点下一步). 2.右键单击 "计算机" ,选择 "属性". 3.单击 "高级系统设置&quo ...
 - Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/ma ven/cli/Maven/java与javac版本不一致问题
		
编译的时候 中出现如下异常: Exception in thread "main" Java.lang.UnsupportedClassVersionError: org/apac ...
 - java与javac版本不一致问题
		
问题描述: 设置了环境变量JAVA_HOME为jdk1.5.0_14的安装目录,并且在PATH变量中加入了%JAVA_HOME%\bin,但在Windows命令行下,执行java -versio ...
 - 观察者模式--java jdk中提供的支持
		
一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...
 
随机推荐
- Linux+Wine运行QQTIM (2022年9月)
			
测试的版本Tim3.4.0 QQ9.6.7 如果你的系统没有Wine先装Wine,Wine在各大发行版的源都能找到.记住32位和64位的Wine都要装 去https://tubentubentu.pa ...
 - Django 之ModelAdmin对象
			
一.后台管理系统配置 1 在该表对应的models类里面添加一个Meta类 class Meta: verbose_name_plural = '用户表' #指定该表在admin后台的名字为:用户表 ...
 - CF600E Lomsat gelral (线段树合并)
			
相当于是线段树合并的模板题,比(雨天的尾巴)还要板. 唯一注意的是线段树的更新,因为同一子树中可能有多种颜色占主导地位,要输出编号和,比如一颗子树中,1出现3次(最多),3出现3次,那么应该输出4. ...
 - 【Java】 DirectByteBuffer堆外内存回收
			
PhantomReference虚引用 在分析堆外内存回收之前,先了解下PhantomReference虚引用. PhantomReference需要与ReferenceQueue引用队列结合使用,在 ...
 - 2022-08-14-esp32把玩记-③_轻轻松松显示个二维码(esp32+ssd1306显示图片)
			
layout: post cid: 9 title: esp32把玩记-③ 轻轻松松显示个二维码(esp32+ssd1306显示图片) slug: 9 date: 2022/08/14 09:22:0 ...
 - 使用HTML表单收集数据
			
1.什么是表单 在项目开发过程中,凡是需要用户填写的信息都需要用到表单. #2.form标签 在HTML中我们使用form标签来定义一个表单.而对于form标签来说有两个最重要的属性:action和m ...
 - v-for和router-link的共同使用
			
1. 错误例子 <div style="color: red" v-for="item in pressionList" :key="item. ...
 - 齐博x1万能数据统计接口
			
为何叫万能数据统计接口呢?因为可以调用全站任何数据表的数据总条数,并且可以设置查询条件http://qb.net/index.php/index/wxapp.count.html?table=memb ...
 - (数据科学学习手札145)在Python中利用yarl轻松操作url
			
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在诸如网络爬虫.web应用开发 ...
 - Spring Retry 重试
			
重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次.用定时任务也可以实现重试的效果,但比较麻烦,用Spring Retry的话一个注解搞定所有.话不多说 ...