一个方便的参考,涵盖从从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 { |
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) { |
新的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和stripJDK 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和transformJDK 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(ThreadonSpinWait)优化忙等待样式循环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 10,JDK 11
- XX:AllocateHeapAt=<path>支持替代内存设备JDK 10
- 进入JDK 12: G1 GC性能改进:可中断的混合集合,以满足用户提供的暂停目标,在空闲时自动将Java堆内存返回给操作系统JEP 344,JEP 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使用的记录器实现
- 参加JDK 12:基于JMH JEP 230的 Microbenchmark Suite
安全改进
- 验证传入的序列化数据JDK 9
- 默认密钥库类型是标准PKCS12,而不是专有的JKS JDK 9
- JDK提供了一组默认的根证书颁发机构(CA)证书,因此TLS连接正在开箱即用JDK 10
- 基于DRBG的SecureRandomJDK 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的要求
加密
启动
- 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
字节码
- 为静态字符串连接生成的字节码使用invokedynamic而不是直接创建StringBuilderappend链。这将使字符串连接的未来优化成为可能,而不需要更改字节码。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)
- 删除Threaddestroy和Threadstop。
- 从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 8于2014年发布。我们不得不等待JDK 9的三年半。但从那时起事情就加速了。Java有一个新的发布结构,旨在每六个月发布一个新版本。JDK 10和 JDK 11已经推出了许多功能。
虽然仍然支持Java 8,但迁移到Java 11会为表带来大量改进。