自版本8的版本以来,最多可达16版,Java成形为180 jdk增强建议(JEP),每个提升建议都带来了一些改进对平台。此页面是最重要的改进的分类和策划列表。
JDK和JDK9项目下的OpenJDK网站上可以找到JEP的完整列表。
默认情况下,所有功能通常可用并启用,除非它们被标记为以下之一:
预览➤功能完全指定和实现,但尚未被视为最终。他们被认为几乎完整,等待了一系列的真实反馈。必须明确启用它们。
实验性💥特征不太稳定,更有可能改变。它们也必须明确启用。
孵化器🥚模块是非最终工具和API,并分布在单独的模块中。
由于Java 8对语言进行了许多影响的改进。本节是快速回顾过去几年发生的事情。有关更深入的指南,请参阅Java 8以来的新语言功能。
记录类,简短的语法来定义不可变DTOS JDK 16(在JDK 15 JDK 14中的预览🔍)记录点(int x,int y){} var point = new point(1,2);观点 。 X (); //返回1点。 y(); //返回2
模式匹配,例如,在类型检查JDK 16之后消除对显式投射的需要(在JDK 15 JDK 14中的预览🔍)(OBJ Instanceof String S& s。Length()> 5){system。出去 。 println(" obj是一个超过5个字符的字符串:" + s。touppercase()); }
密封类可以限制其他类可能扩展它们(预览🔍)JDK 16 JDK 15公共摘要密封类形状允许圈,矩形{...}公共类圆延伸{...} // ok公共类矩形延伸形状{...} // ok公共类三角形扩展{...} //编译错误//无需默认情况,如果所有允许的类型都被覆盖双面区域=开关(形状){Case Circle C->数学 。 POW(c。RADIUS(),2)*数学。 PI Case Rectangle R - > r。 a()* r。 B()};
有用的nullpointerexceptions精确描述哪个变量为null jdk 15(在-xx:+ showcodedetailsinexceptionmessages中启用了jdk 14)a。湾C 。我= 99; ---线程"主要" Java。郎。 nullpointerexception:无法读取字段" c"因为" a.b"一片空白
Switch表达式JDK 14(预览🔍在JDK 12 JDK 13中)INT Numletters = Switch(Day){案例星期一,周五,星期五 - > 6;案例周二 - > 7;默认 - > {string s = day。 toString(); int结果= s。长度 ();产量结果; }};
引入VAR使局部变量声明减少隆重的JDK 11(没有兰布斯的JDK 10中的LAMBDA支持)
选择加入和向后兼容的模块系统,以避免运行时的ClassDefNotFoundErrors,并创建内部APIS JDK 9(Project Jigsaw)
让我们继续使用Java标准库,专注于我们可以在日常编码中使用的新功能。 如果您对Java 8以后版本之间的所有API级别差异感到好奇,请检查GitHub上的CaveroPenjdk / JDK-API-Diff或Java Version almanac。 stream.Tolist为方便最典型的收集方法(而不是依赖于.collect(收集器.Tolist())JDK 16 Stream.MapMulti用零个或多个元素替换此流的每个元素,替代Flatmap JDK 16 矢量API以表达编译为最佳硬件指令(孵化器🥚)JDK 16的计算计算 用于静态键入的纯-Java访问本机代码(孵化器🥚)JDK 16的外国链接器API 外部内存访问API以访问Java堆(孵化器🥚)JDK 16的内存
收藏家创建一个收藏家,这是一个两个下游收集器JDK 12的综合
标准HTTP客户端特有HTTP / 2,WebSocket支持和非阻塞API JDK 11(孵化器🥚在JDK 9中)
便利工厂用于集合的方法,以缓解没有收集文字JDK 9 SET<整数> myset = set。 (1,2,3);列表<整数> mylist = list。 (1,2,3);映射<字符串,整数> mymap = map。 ("一个",1,"两个",2);
更改的更多选项(删去,花束)并生成(迭代,以ulnultable)流; Readonly收藏家(TounModifiaBlist); optionals可以转换为Streams JDK 9
进程API提供更多信息和控制(例如,进程ID,参数,CPU时间,父/子进程),增强ProcessBuilder以帮助创建流水线JDK 9
VARHANDLE API替换java.util.concurrent.atomic和Sun.misc.unsafe的字段和阵列相关操作,以便提供低级访问机制,例如,原子写。 JDK 9.
增强折旧政策。 @deprecated可以标有漂蒸,它发出新的警告。 JDK 9.
OASIS标准XML目录API以安全且表情的方式管理XML中的外部资源JDK 9 Unicode 10.0,添加大约27.000个字符,10个块和30多个脚本JDK 11(在JDK 9中支持Unicode 8.0支持) 所有平台的桌面功能,如登录/注销/锁定事件侦听器和任务栏交互JDK 9 弹性密度将未使用的热点类元数据内存返回操作系统更迅速的JDK 16 外部存储器访问API安全有效地使用堆叠内存(孵化器🥚)JDK 15 JDK 14 应用程序类数据共享以通过在Java进程之间共享类元数据来改进启动时间并减少占用空间。 JDK 10. 默认情况下启用默认类列表的类 - 数据共享存档,以改进框外启动时间JDK 12
分隔了分析了分析和非分布式编译代码的代码缓存,从而提高性能和内存占用JDK 9 使用Java 2D中的Marlin渲染器作为默认的图形光栅化器而不是Pisces JDK 9 通过利用最近推出的SPARC和英特尔X64 CPU指令JDK 9来改进Ghash和RSA性能 线程堆栈上的额外空间,用于关键部分,减轻java.util.concurrent锁中的死锁的风险,以防堆栈溢出JDK 9 Linux(实验性💥)JDK 10(GRAAL作为实验JIT编译器)JDK 9(JVM编译器接口)JDK 9(GRAAL作为AOT编译器)的提前的汇编能力 Z垃圾收集器,在大堆JDK 16 JDK 15上提供非常低的暂停时间(JDK 14(Windows)JDK 14(OS X)JDK 11(Linux)) Shenandoah垃圾收集器,提供与ZGC类似的福利,但基于不同的算法JDK 15(实验性💥在JDK 12)
epsilon垃圾收集器,它不实现实际的内存填海,争取最低的开销可能的JDK 11 Flight Recorder事件流:通过API提供分析数据,使其适用于连续监控JDK 14 运行时可管理和方法特定于C1和C2编译器的特定控制,该编译器能够包含测试JDK 9 微粒,易于配置的伐木系统,用于JVM JDK 9的所有组件(Unified JVM Logging)JDK 9(Unified GC Logging) 允许应用程序提供由平台类JDK 9使用的记录器实现 默认的根证书颁发机构(CA)证书设置了JDK,因此TLS连接在框JDK 10中工作 TLS应用层协议协商(ALPN)扩展,可以在没有额外的圆形旅行的情况下实现协议协商; ALPN是HTTP / 2连接JDK 9的要求
使用--Release的旧平台版本编译 - 释放 - 源和-target以及对适当的平台版本JDK 9的链接
打包工具创建自包含的应用程序,也支持本机包格式:MSI,EXE,PKG,DMG,DEB和RPM JDK 16(孵化器🥚在JDK 14)→相关:内部Java - 第12集12“JPackage”与Kevin Rushforth
Jlink Java链接器可以为模块化Java应用程序Thag构建优化的,苗条运行时映像仅包含JDK JDK 9 - [2],[3],[4],[4],[5]的所需部分。
多释放jar文件,允许单个归档JDK 9中的多个java释放特定版本的类
Javadoc工具现在发出HTML5标记而不是基于帧的布局,文档包含一个搜索框以简化导航JDK 9 - [2],[3]
使用查找:: defineHiddenclass()替换不安全:: defileeanhonamousclass(),用于动态生成无法发现,链接和直接使用其他类无法发现,链接和使用的隐藏类的框架。 JDK 15.
java.lang.Invoke.Constant包以允许对可加载常量的简单描述(LDC指令的操作数),这比依赖于ad-hoc字符串表示jdk 12更低易于易于错误
Constant_dynamic常量池条目,使用引导映射执行分辨率,类似于InvokeDynamic调用JDK 11
引入嵌套访问控制上下文,它在相同代码实体中包装的类 - 例如嵌套类 - 并消除了编译器将桥接方法插入生成的字节码。 JDK 11.
为静态字符串连接生成的字节码使用InvokeDynamic而不是直接创建StringBuilder#Append链。这将使在不需要字节码的变化的情况下,这将使未来的字符串连接优化。 JDK 9.
默认情况下,强烈封装内部API(SUN。*),除了SUN.MISC.UNSAFE等关键API之外,SUNSAFE放松的强大封装由Launcher Option -illegal-Access JDK 16控制(在JDK 9中已弃用 - [2])
弃用原始包装类的构造函数,禁止在包装器对象上同步(字节,短,整数,长,浮动,双,布尔和字符)JDK 16
删除Nashorn JavaScript引擎和JJS工具JDK 15(在JDK 11中弃用)
弃用RMI激活,影响Java.rmi.activation包和RMID工具,不会影响JDK 15中的Java RMI
删除启动时JRE版本选择指令:JRE-VREATION MAINAST ENTRACE和-VERSION:CLI选项JDK 9 从JRE JDK 9中删除覆盖标准覆盖(lib / endersed)和扩展(lib / ext)机制 如果您对Java 8和14之间的所有API级别差异感到好奇,请检查Java almanac项目。 还要查看JDEPS,Java类依赖性分析器,了解您的项目是否仍在使用旧内部API。 JDK 8于2014年发布。我们不得不等待JDK 9的三年半。但从那里加速了。 Java有一个新的释放结构,旨在每六个月提供新版本。 虽然仍然支持Java 8,但迁移到最新版本会给表带来相当数量的改进。