草庐IT

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

郊行即事 2023-04-18 原文

目录

Java18(2022.3)

  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版本,也就是官方保证会长期支持的版本。

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

有关Java/JDK各版本主要特性汇总的更多相关文章

  1. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  5. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  6. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

随机推荐