✅ 已更新到JDK 17。
文章目录
一、简介
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境。(JVM+Java系统类库)和JAVA工具。
没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
二、版本
SE(JavaSE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
EE(JavaEE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。从2018年2月26日开始,J2EE改名为Jakarta EE [1-2] 。
ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
JDK 11(2018年9月)(LTS版本)
JDK 12(2019年3月)
JDK 13(2019年9月)
JDK 14(2020年3月)
JDK 15(2020年9月)
JDK 16(2021年3月)
JDK 17(2021年9月)(LTS版本)
三、JDK各个版本的新特性
1、JDK 5
- 泛型
- foreach,更简洁的for循环
- 自动拆箱装箱
- 枚举
- 静态导入
- 元数据
- 线程池
2、JDK 6
- Desktop类和SystemTray类
- JAXB2实现对象与XML之间的映射
- 轻量级Http Server API
- 插入式注解处理API(Pluggable Annotation Processing API)
- 对脚本语言的支持(如:ruby,groovy,javascript)
- StAX
- 使用Complier API
- 用Console开发控制台程序
- Common Annotations
3、JDK 7
- switch中可以使用字串了
- try-with-resource语句
- 泛型实例化类型自动推断
- 新增一些取环境信息的工具方法
- Boolean类型反转,空指针安全,参与位运算
- 两个char间的equals
- 安全的加减乘除
- 二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。
- 使用一个catch语言来处理多种异常类型
4、JDK 8
- Lambda 表达式
- 函数式接口
- 接口的默认方法
- 方法与构造函数引用
- Lambda 作用域
- 访问局部变量
- 访问对象字段与静态变量
- Date API
- 多重Annotation 注解
- 访问接口的默认方法
5、JDK 9
- Java 平台级模块系统
- 提供了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法
- 接口支持私有方法
- JShell : 交互式 Java REPL
- 集合工厂方法
- Stream API的改进
- try-with-resources的改进
- 多版本兼容 JAR
- Linking
- 设置G1为JVM默认垃圾收集器
- 支持http2.0和websocket的API
6、JDK 10
- 局部变量类型推断
- 将JDK多存储库合并为单储存库
- 垃圾回收接口
- 并行Full GC 的G1
- 应用数据共享
- 线程局部管控
- 移除Native-Header Generation Tool (javah)
- Unicode 标签扩展
- 备用内存设备上分配堆内存
- 基于实验JAVA 的JIT 编译器
- Root 证书
- 基于时间的版本控制
7、JDK 11
- Local Var
Lambda表达式中,可以使用var关键字来标识变量,变量类型由编译器自行推断。 - HttpClient
JDK11的新的HttpClient支持HTTP/2和WebSocket,并且可以使用异步接口。 - Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
- Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
- 对Stream、Optional、集合API进行增强
- 读写文件
对Files类增加了writeString和readString两个静态方法,可以直接把String写入文件,或者把整个文件读出为一个String。 - String API
String新增了一些方法,strip()、isBlank()、lines()、repeat()。
8、JDK 12
- 新增方法Files.mismatch(Path, Path)
- 新增NumberFormat对复杂数字的格式化
- Switch 表达式扩展,可以有返回值
- 字符串支持transform、indent操作
- Teeing Collector
- 支持unicode 11
- Shenandoah GC,新增的GC算法
- G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率
9、JDK 13
- SocketAPI 重构,Socket的底层实现优化,引入了NIO
- Switch 表达式扩展,switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break
- 文本块升级 “”" ,引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符
- FileSystems.newFileSystem新方法
- ZGC优化,释放内存还给操作系统
10、JDK 14
- 引入Record类型,类似于Lombok 的@Data注解,可以向Lombok一样自动生成构造器、equals、getter等方法;
- Switch 表达式-标准化
- instanceof模式匹配,instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量
- 删除 CMS 垃圾回收器
- 改进 NullPointerExceptions提示信息,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查。
11、JDK 15
- EdDSA 数字签名算法
- Sealed Classes(封闭类,预览),通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用
- Hidden Classes(隐藏类)
- 移除 Nashorn JavaScript引擎
- 改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现
12、JDK 16
- 允许在 JDK C ++源代码中使用 C ++ 14功能
- ZGC性能优化,去掉ZGC线程堆栈处理从安全点到并发阶段
- 增加 Unix 域套接字通道
- 弹性元空间能力
- 提供用于打包独立 Java 应用程序的 jpackage 工具
13、JDK 17
- Free Java License
- JDK 17 将取代 JDK 11 成为下一个长期支持版本
- Spring 6 和 Spring Boot 3需要JDK17
- 移除实验性的 AOT 和 JIT 编译器
- 恢复始终执行严格模式 (Always-Strict) 的浮点定义
- 正式引入密封类sealed class,限制抽象类的实现
- 统一日志异步刷新,先将日志写入缓存,然后再异步刷新