java1-java21各版本新特性

329 阅读10分钟

java1.0

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

java1.1

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

java2

  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. 控制授权/访问系统资源的策略工具

java3

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

java4

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

java5

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

java6

  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 Instrumentation
引入JDBC 4.0 API
支持可插拔注解

java7(LTS版本)

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

switch以String为条件,总计支持4种基本类型(byte,char,short,int),2种对象类型(枚举,String)
钻石型语法,省略类型参数的声明
支持了动态语言

java8(LTS版本)建议

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

对各个类支持了很多对应的lambda增强方法
增强接口,支持了接口的默认和静态的具体方法
支持LocalDate等时间包,以改进原有Date
支持Optional来改进Null值的处理
优化了HashMap和ConcurrentHashMap

java9

  1. 模块化(Java平台级模块系统)
  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

JShell,类似node.js,python一样的命令行工具,对待简单的东西,可以直接命令测试
改进Javadoc, 使得Javadoc可以搜索
以List.of(), Set.of(), Map.of()的方式初始化不可变集合,省略了代码,语法糖
改进Stream API,比如ofNullable(),dropWhile(),takeWhile()等
增强接口,支持了私有接口具体方法,补充了Java8默认和静态方法的支持
把G1垃圾收集器作为默认的垃圾收集器,并标注CMS为过时收集器
引入了响应式流Reactive Streams API, 支持了响应式编程
支持了HTTP/2客户端

java10

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

支持了局部变量的var声明
优化改进了G1垃圾回收器,采用并行化mark-sweep-compact算法

java11(LTS版本)

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

简化了启动单个源代码文件的方法,使得小白命令式编译运行Java文件变成更加简单,java Helloworld.java 即可
增加支持了一个叫Epsilon的低开销垃圾收集器
增加支持了一个叫ZGC(Z Garbage Collector)的可伸缩低延迟垃圾收集器, 相比G1,停顿时间有了很大的改进,稳定在10ms以下
重写了HttpClient,提供了新的标准化HttpClient API, 以后不再需要引入apache包的HttpClient或是okhttp就能支持高性能的网络编程
允许了飞行记录器进行商用下的使用
更好的支持了动态语言,在JVM层面增加了invokedynamic指令
支持了在lambda内部使用var声明局部变量

java12

  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的效率

引入了一个叫Shenandoah 低停顿的实验性垃圾收集器
引入了实验性的预览版Switch语句优化,可以省略break语句,合并多个case
引入了JVM的常量API, 有助于一些分析的实现

java13

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

增强优化了ZGC垃圾收集器, 归还未使用的堆内存给操作系统
将Java12引入的预览版Switch语法提为正式版,使得Switch的使用更加的顺滑和流畅
支持了"""字符串块功能

java14

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

java15

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

java16

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

java17(LTS版本)建议

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

java18

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

java19

  1. Record 模式匹配 (Preview)
  2. 虚拟线程 (预览)
  3. Switch 模式匹配 (三次预览)
  4. Linux/RISC-V Port
  5. Vector API (四次孵化)
  6. 外部函数 & 内存 API (Preview)
  7. Structured Concurrency (Incubator)

java20

  1. 作用域值(孵化器)
  2. Record 模式匹配(第二次预览)
  3. switch 的模式匹配(第四次预览)
  4. 外部函数和内存 API(第二个预览版)
  5. 虚拟线程(第二个预览版)
  6. 结构化并发(第二孵化器)
  7. Vector API(第五孵化器)

java21(LTS版本)建议

  1. 字符串模板(预览版)
  2. 虚拟线程(在JDK19中是预览版,在JDK21中是正式版,会大大改变多线程的编程风格和解决问题的方式)
  3. 顺序集合(JDK21引入了SequencedCollection、SequencedSet 、SequencedMap 接口,这些接口提供了在集合开头或结尾处添加、修改或删除元素的方法,以及反转集合的功能)
  4. 分代ZGC(属于JVM层面的功能)
  5. 记录模式
  6. switch的模式匹配
  7. 未命名模式和变量(预览版)
  8. 未命名类和实例的main方法(预览版)
  9. 作用域值(预览版)
  10. 矢量API(第六个孵化器)
  11. 弃用Windows32位x86端口
  12. 禁止代理的动态加载
  13. 密钥封装机制的API(引入密钥封装机制 (KEM) 的 API,是一种使用公钥加密来保护对称密钥的加密技术)
  14. 结构化并发(预览版, 简化并发编程)
  15. 外部函数与内存API(第三次预览版)

LTS版本(long-term support,长期支持版)。目前LTS版本有:JDK7,8,11,17,21。
通过查看JDK的release文件,如果关键字是"commercial",则说明JDK是收费的
据说小版本里,版本号<=221为免费,>=222为收费