自JDK 8 以来所有Java和JVM新功能的分类列表

栏目: Java · 发布时间: 5年前

内容简介:一个方便的参考,涵盖从从Java 8到11及更高版本各种新语言功能到新版本命名方案的所有内容。自从版本8发布到版本11以来,Java由120个因为每个类别中都有许多功能,所以我决定不按时间顺序显示它们,而是从那些看起来最重要的功能开始。此外,我在每个类别的末尾添加了预期的JDK 12功能。

一个方便的参考,涵盖从从 Java 8到11及更高版本各种新语言功能到新版本命名方案的所有内容。

自从版本8发布到版本11以来,Java由120个 JDK增强建议 (JEP)构成,每个 建议 都为平台带来了一些改进。我决定阅读它们并根据改进创建一个简明的分类列表。

因为每个类别中都有许多功能,所以我决定不按时间顺序显示它们,而是从那些看起来最重要的功能开始。此外,我在每个类别的末尾添加了预期的JDK 12功能。

新语言功能

当Java 8引入lambdas时,这是一个非常巨大的变化。虽然最近的版本没有添加这样有影响力的功能,但是对该语言进行了许多小的改进。

1. JDK 10,JDK 11引入var使局部变量声明不那么隆重的

var greeting = "Hello World!";

2. JDK 9(项目Jigsaw)加入和向后兼容的模块系统,以避免ClassDefNotFoundErrors在运行时创建内部API

module hu.advancedweb.helloworld {
    requires hu.advancedweb.somedependency;
    exports hu.advancedweb.hello
}

3. JDK 9 接口中增加私有方法(Milling Project Coin)

4. JDK 9 加入匿名内部类的Diamond 操作符

5. JDK 9 加入Try-with-resources允许有效的最终final变量

6. JDK 9 加入@SafeVargs私有实例方法

7. JDK 9 import语句没有了deprecation警告

8. JDK12: Switch Expressions(预览版)

JEP 325

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

新的API

让我们继续Java标准库,重点关注我们可以在日常编码中使用的新功能。

如果您对Java 8和11之间的所有API级别差异感到好奇,请检查 版本8和11之间 的  Java API差异

一般

  • 便利工厂收集方法,以减轻没有收集文字的痛苦 JDK 9
    Set<Integer> mySet = Set.of(1, 2, 3);
    List<Integer> myList = List.of(1, 2, 3);
    Map<String, Integer> myMap = Map.of("one", 1, "two", 2);
  • 标准HTTP客户端,具有HTTP / 2,WebSocket支持和非阻塞API  JDK 9 (孵化器), JDK 11 (标准)
    HttpClient httpClient = HttpClient.newBuilder().build();
    
    HttpRequest request = HttpRequest.newBuilder()
              .uri(URI.create("https://advancedweb.hu/"))
              .GET()
              .build();
    
    HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
  • Reactive Streams发布 - 订阅框架,用于使用非阻塞背压 JDK 9 进行异步流处理
  • 基于时间的增强CompletableFuture(超时,延迟) JDK 9
  • 字符串的改进,如isBlank,lines,repeat和strip JDK 11
  • 更多转换(dropWhile,takeWhile)和生成(iterate,ofNullable)流的选项; readonly collectors(toUnmodifiableList); 选项可以转换为流 JDK 9
  • Arrays.mismatch:找到两个数组 JDK 9 之间的第一个不匹配元素
  • Stack-Walking API允许懒惰和堆栈帧过滤 JDK 9
  • Process API提供更多信息和控制(例如进程ID,参数,CPU时间,父/子进程),增强ProcessBuilder以帮助创建流程管道 JDK 9
  • VarHandleAPI来代替场和阵列相关的操作java.util.concurrent.atomic和sun.misc.Unsafe为了提供低级别的访问mechamisms,例如原子写入。 JDK 9
  • JDK 9的 新组合器和查找方法MethodHandle
  • 增强的弃用政策。@Deprecated可以标记forRemoval,发出新警告。 JDK 9
  • OASIS标准XML目录API,以安全,高效的方式管理XML中的外部资源 JDK 9
  • 将JDK的XML解析器Xerces更新为2.11.0版 JDK 9
  • TIFF支持图像I / O框架 JDK 9
  • 即将在JDK 12:字符串增强功能:align,indent和transform JDK 12
  • 进入JDK 12 :: Files.mismatch在两个文件 JDK 12 的内容中找到第一个不匹配的字节
  • 进入JDK 12: Collectors.teeing创建一个由两个下游收集器 JDK 12 组成的收集器

国际化

  • ResourceBundle以UTF-8而不是ISO-8859-1  JDK 9 加载属性文件
  • Unicode 10.0,添加大约27.000个字符,10个块和30个以上的脚本 JDK 9 (Unicode 8.0), JDK 11 (Unicode 10.0)
  • java.util.Locale和相关的API支持货币类型,时区和更多 JDK 10
  • 默认 JDK 9 启用CLDR区域设置数据

图形和桌面应用程序

  • 适用于所有平台的桌面功能,如登录/注销/锁定事件监听器和任务栏交互 JDK 9
  • MultiResolutionImage这使得为​​DPI  JDK 9 轻松检索特定于分辨率的图像
  • Windows和Linux  JDK 9 上的HiDPI Graphics
  • Linux 上为JavaFX,Swing和AWT  JDK 9 启用GTK 3
  • 使用Swing  JDK 9的 注释替换@beaninfoJavadoc标记@BeanInfo
  • 将JavaFX / Media中包含的GStreamer更新为1.4.4版 JDK 9
  • 用HarfBuzz  JDK 9 替换现有的ICU OpenType字体布局引擎

性能改进

一般

  • 节省空间的紧凑字符串,可以更有效地存储Latin-1字符串 JDK 9
  • 异形和非分析编译代码的代码高速缓存是分开的,从而提高了 JDK 9的 性能和内存占用
  • 将Interned Strings存储在类数据共享存档中以减少内存消耗 JDK 9
  • 应用程序类 - 数据共享通过在Java进程之间共享类元数据来缩短启动时间并减少占用空间。 JDK 10
  • 进入JDK 12:默认启用默认类列表的类数据共享存档,以改善开箱即用的启动时间 JEP 341

库包相关

  • 改进的内在的java.lang.Math sin,cos并且log功能上AArch64处理器 版本的JDK 11
  • 安全管理器性能改进 JDK 9
  • Spin-Wait Hint(Thread#onSpinWait)优化忙等待样式循环 JDK 9
  • 在Java 2D中使用Marlin Renderer作为默认图形光栅化器而不是Pisces  JDK 9
  • 利用最近推出的SPARC和Intel x64 CPU指令 JDK 9, 改进了GHASH和RSA性能

并发

  • 改进了竞争对象监视器的性能 JDK 9
  • 关键部分的线程堆栈上的额外空间,java.util.concurrent在堆栈溢出的情况下降低锁中死锁的风险 JDK 9
  • Thread-Local握手停止单个线程 JDK 10

编译器

  • javac中的性能改进:类型检查多重表达式的新策略 JDK 9
  • Linux  JDK 9 (JVM编译器接口), JDK 9 (Graal作为AoT编译器), JDK 10 (Graal作为实验性JIT编译器)的实验性提前编译功能

垃圾收集器

  • G1垃圾收集器现在是默认值而不是Parallel GC  JDK 9
  • G1 GC性能改进:并行完整GC以改善最坏情况延迟 JDK 10
  • 介绍Z垃圾收集器,它在大堆 JDK 11 上提供非常低的暂停时间
  • 介绍Epsilon垃圾收集器,它不实现实际的内存回收,争取尽可能低的开销 JDK 10JDK 11
  • XX:AllocateHeapAt=<path>支持替代内存设备 JDK 10
  • 进入JDK 12: G1 GC性能改进:可中断的混合集合,以满足用户提供的暂停目标,在空闲时自动将Java堆内存返回给操作系统 JEP 344JEP 346
  • 进入JDK 12:介绍Shenandoah垃圾收集器,提供与ZGC类似的好处,但基于不同的算法 JEP 189

诊断和工具

  • Flight Recorder是OpenJDK  JDK 11的 一部分
  • 通过JMTI  JDK 11进行 低开销堆分析
  • C1和C2编译器的运行时可管理和方法特定控制,支持包含测试 JDK 9
  • 针对JVM  JDK 9 (统一JVM日志记录), JDK 9 (统一GC日志记录)的所有组件的细粒度,易于配置的日志记录系统
  • 允许应用程序提供平台类 JDK 9 使用的记录器实现
  • 参加JD​​K 12:基于JMH  JEP 230的  Microbenchmark Suite

安全改进

  • 验证传入的序列化数据 JDK 9
  • 默认密钥库类型是标准PKCS12,而不是专有的JKS  JDK 9
  • JDK提供了一组默认的根证书颁发机构(CA)证书,因此TLS连接正在开箱即用 JDK 10
  • 基于DRBG的SecureRandom JDK 9
  • 使用基于SHA-1的签名 JDK 9 禁用X.509证书链
  • SHA-3哈希算法 JDK 9

TLS

  • TLS 1.3支持 JDK 11
  • 数据报传输层安全性API(DTLS) JDK 9
  • OCSP装订TLS以提高证书状态检查 JDK 9的性能
  • TLS应用层协议协商(ALPN)扩展,无需额外往返即可实现协议协商; ALPN是HTTP / 2连接 JDK 9的要求

加密

  • 与Curve25519和Curve448  JDK 11的 重要协议
  • ChaCha20和Poly1305加密算法 JDK 11

启动

  • jshell:Java REPL  JDK 9 (Project Kulla)
  • 启动单文件源代码程序,包括支持#!Unix  JDK 11 上的shebang()行
  • 编译老年人平台版本的--release,其配置--source和--target以及对相应平台版本链接 JDK 9
  • 早期验证JVM命令行标志以避免崩溃 JDK 9

打包

  • jlinkJava Linker可以为模块化Java应用程序构建优化的,纤薄的运行时映像,它只包含JDK JDK 9 的所需部分- [  1  ],[  2  ],[  3  ],[  4  ],[  4  ], [  5  ]
  • 多发行版JAR文件,允许在单个存档 JDK 9中 使用多个特定于Java发行版的类

的Javadoc

  • Javadoc工具现在发出HTML5标记而不是基于框架的布局,文档包含一个搜索框以简化导航JDK 9 - [  1  ],[  2  ],[  3  ]

字节码

  • 为静态字符串连接生成的字节码使用invokedynamic而不是直接创建StringBuilder#append链。这将使字符串连接的未来优化成为可能,而不需要更改字节码。 JDK 9
  • INVOKEDYNAMIC可以表示对象属性和/或集合 JDK 9 的高级操作
  • CONSTANT_Dynamic常量池条目,使用引导来执行分辨率,类似于INVOKEDYNAMIC调用 JDK 11
  • 引入了包含相同代码实体中的类的Nest访问控制上下文(例如嵌套类),并且无需编译器将桥接方法插入到生成的字节码中。 JDK 11
  • 进入JDK 12: java.lang.invoke.constant包,允许轻松描述可加载常量(ldc指令的操作数),这比依赖于ad-hoc字符串表示 JEP 334 更不容易出错。

新平台

JDK 9为另外三个平台提供支持:

弃用和删除

本节总结了Java 8和11之间的重大更改和弃用。

  • 下划线不再是有效的标识符( JDK 9
  • var不再是有效的类名( JDK 10
  • 删除Java EE( JDK 11
  • 删除CORBA( JDK 11
  • 内部API(sun.*)被删除或弃用(JDK 9 - [  1  ],[  2  ])
  • 删除apple.applescript和com.apple打包( JDK 9
  • 使用基于SHA-1的签名禁用X.509证书链( JDK 9
  • 删除启动时JRE版本选择指令:JRE-Version清单条目和-version:cli选项( JDK 9
  • 删除jhat工具( JDK 9
  • 删除JVM TI hprof代理( JDK 9
  • 删除JDK 8中不推荐使用的GC组合( JDK 9
  • 删除javah工具( JDK 10
  • 删除Thread#destroy和Thread#stop。
  • 从JRE中删除Endorsed Standards Override(lib/endorsed)和Extensions(lib/ext)机制。
  • rt.jar从JRE中删除。
  • ResourceBundle以UTF-8而不是ISO-8859-1( JDK 9 )加载属性文件
  • 弃用Applet API( JDK 9
  • 弃用Nashorn Javascript引擎( JDK 11
  • 弃用并发标记扫描垃圾收集器( JDK 9
  • 弃用Object.finalize()( JDK 9
  • 弃用Pack200 工具 和API( JDK 11

如果您对Java 8和11之间的所有API级别差异感到好奇,请检查 Java Almanac 项目。还要查看  jdeps ,Java类依赖性分析器,以确定您的项目是否仍在使用旧的内部API。

新版本计划

  • 更简单的版本 - 字符串方案,与语义版本控制一致。 JDK 9JDK 10

总结

JDK 8 于2014年发布。我们不得不等待 JDK 9的 三年半。但从那时起事情就加速了。Java有一个新的发布结构,旨在每六个月发布一个新版本。 JDK 10 和  JDK 11 已经推出了许多功能。

虽然仍然支持Java 8,但迁移到Java 11会为表带来大量改进。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

博客秘诀:超人气博客是怎样炼成的

博客秘诀:超人气博客是怎样炼成的

Darren Rowse、Chris Garrett / 向怡宁 / 人民邮电出版社 / 201005 / 39.00元

作为Web 2.0的新生事物的博客,如今已蓬勃发展,呈燎原之势,业已成为许多人的一种生活方式。中国从事博客写作的人数已达千万级,各类博客网站不可胜数。 然而,为什么有的博客人气鼎盛,拥趸众多,有的博客却门前冷落,少人问津呢?究竟应该怎样写好自己的博客,才能让它吸引更多访客的关注呢?博客网站还能为我做什么呢? 本书的两位作者长期主持知名博客站点ProBlogger.net,指导了成千上万......一起来看看 《博客秘诀:超人气博客是怎样炼成的》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具