当前位置: 首页 > 后端技术 > Java

Java10新特性及代码示例

时间:2023-04-01 16:52:57 Java

大家好,我是大洋。本文主要介绍Java10的新特性,并提供一些代码示例。然而,Java10的新特性大部分是开发者不关心的。Java9发布后,Java10来得非常快。与以前的版本不同,Java10没有那么多令人兴奋的功能,但它仍然有一些重要的更新,这些更新将改变您的编码方式,并影响未来的其他Java版本。本文主要内容:var关键字:局部变量类型推断(据说是JDK10中开发者唯一真正关心的特性)基于时间的发布版本控制垃圾收集器接口G1parallelfullGCreplacesheaponstoragedevicesDistributionConsolidation将多个JDK林集成到一个存储库中应用程序类-数据共享其他Unicode语言标签扩展根证书基于Java的JIT编译器(实验性)线程本地握手已删除本机头构建工具已添加API已删除API1。var关键字:局部变量类型推断Java现在有var声明。它允许开发人员在不指定类型的情况下声明局部变量。变量的类型将从创建的实际对象的类型推断出来。据说这是JDK10中开发人员实际使用的唯一功能。例如varstr="Helloworld";//相当于Stringstr="Helloworld";2、基于时间的发布版本控制从Java10开始,Oracle采用了基于时间的版本字符串方案。版本号的新格式为:$FEATURE.$INTERIM.$UPDATE.$PATCH与旧版本不同,新的基于时间的版本不会延迟,每六个月发布一次功能,功能是无限的。还有一个长期版本(LTS)。主要面向企业客户。产品的LTS版本将提供Oracle的首要和持续支持,并且每3年提供一次。此外,这些版本的更新将至少持续三年。3.垃圾收集器接口在早期的JDK结构中,构成垃圾收集器(GC)实现的组件分散在代码库的各个部分。它在Java10中发生了变化。它现在是JVM源代码中的一个干净接口,允许快速轻松地集成替代收集器。它将改进不同垃圾收集器的源代码隔离。这是纯粹的重构。之前工作的一切都需要在以后工作,性能不应该倒退。4.使用G1的并行完整GCJava9引入了G1(垃圾优先)垃圾收集器。G1垃圾收集器旨在在并发收集不能足够快地回收内存时避免完全收集。通过此更改,将发生回退完整GC。当前G1的fullGC实现使用单线程mark-sweep-compact算法。此更改将使mark-sweep-compact算法并行化并使用相同数量的线程。当收集的并发线程无法足够快地回收内存时,它将被触发。线程数可以通过-XX:ParallelGCThreads选项控制。5.备用存储设备上的堆分配此更改的目标是使HotSpotVM能够在用户指定的备用内存设备(例如NV-DIMM)上分配Java对象堆。要在这样的内存中分配一个堆,我们可以添加一个新选项-XX:AllocateHeapAt=。该选项将采用文件系统的路径并使用内存映射来实现在内存设备上分配对象堆的预期结果。现有的堆相关标志,如-Xmx、-Xms等,以及垃圾收集相关标志将继续像以前一样工作。6.将JDK林合并为一个单一的存储库作为这一变化的一部分,JDK林的众多存储库被合并为一个单一的存储库,以简化和简化开发。在JDK9中有八个存储库:root、corba、hotspot、jaxp、jaxws、jdk、langtools和nashorn。在统一林中,Java模块的代码通常组合在一个顶级src目录下。例如,今天在JDK林中有基于模块的目录,如$ROOT/jdk/src/java.base...$ROOT/langtools/src/java.compiler...在合并林中,此代码更改为组织为-$ROOT/src/java.base$ROOT/src/java.compiler...7.应用程序类-数据共享此功能的目标是改善启动足迹,扩展现有的类数据共享(“CDS")功能允许将应用程序类放置在共享存档中。JDK5中引入的类数据共享允许将一组类预处理为共享归档文件,然后可以在运行时对其进行内存映射以减少启动时间。当多个JVM共享同一个存档时,它还减少了动态内存占用。目前CDS只允许引导类加载器加载归档类。应用程序CDS允许内置系统类加载器、内置平台类加载器和自定义类加载器加载归档类。指定-XX:+UseAppCDS命令行选项以启用系统类加载器、平台类加载器和其他用户定义的类加载器的类数据共享。8.额外的Unicode语言标签扩展其目标是增强java.util.Locale和相关API以实现额外的Unicode扩展BCP47语言标签。对BCP47语言标签的支持最初是在JavaSE7中添加的,支持仅限于日历和数字Unicode语言环境扩展。这个JEP将在相关的JDK类中实现更多在最新的LDML规范中指定的扩展。这个JEP将增加对以下额外扩展的支持:cu(货币类型)fw(一周的第一天)rg(区域覆盖)tz(时区)修改后的相关API为:java.text.DateFormat::get*Instancejava.text.DateFormatSymbols::getInstancejava.text.DecimalFormatSymbols::getInstancejava.text.NumberFormat::get*Instancejava.time.format.DateTimeFormatter::localizedByjava.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePatternjava.time.format.DecimalStyle::ofjava.time.temporal.WeekFields::ofjava.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}java.util.Currency::getInstancejava.util.Locale::getDisplayNamejava.util.spi.LocaleNameProvider9。根证书cacertskeystore是JDK的一部分,旨在包含一组根证书,可用于建立对各种安全协议中使用的证书链的信任。但是,JDK源代码中的cacerts密钥库目前是空的。cacerts密钥库将填充一组由Oracle的JavaSE根CA程序的CA颁发的根证书。许多供应商已经签署了所需的协议,每个供应商都将包含一份根证书列表。没有签署协议的将不包括在内。那些需要更长时间处理的将包含在下一个版本中。这也意味着Oracle和OpenJDK二进制文件在功能上是相同的。TLS等关键安全组件将在未来的OpenJDK构建中默认运行。10.基于Java的JIT编译器(实验性)此功能使基于Java的JIT编译器Graal可以用作Linux/x64平台上的实验性JIT编译器。Graal将使用JDK9中引入的JVM编译器接口(JVMCI)。Graal已经在J??DK中,因此将其作为实验性JIT启用主要是测试和调试工作。要启用Graal作为JIT编译器,请在java命令行中使用以下选项:-XX:+UnlockExperimentalVMOptions-XX:+UseJVMCICompilerGraal是从头开始用Java完全重写的JIT编译器。以前的JIT编译器是用C++编写的。11.线程本地握手这个JEP通过在应用程序线程上执行回调而无需实现全局VM安全点,为提高VM性能奠定了基础。这意味着JVM可以停止单个线程,而不仅仅是所有线程。线程本地握手最初将在x64和SPARC上实现。其他平台将回落到正常的安全点。新的产品选项-XX:ThreadLocalHandshakes(默认为true)允许用户在支持的平台上选择正常的安全点。12、移除Native-Header生成工具它会从JDK中移除javah,这是一个在编译JNI代码时生成头文件的单独工具,因为这可以通过javac来完成。这是另一个Java10专注于管家特性。13、新增APIJava10新增了73个API,我们来看其中的几个:API说明Optional.orElseThrow()orElseThrow类新增了一个方法Optional。它是现有方法的同义词,现在是现有方法的首选替代get方法。方法List.copyOf、Set.copyOf和Map.copyOf从现有实例创建新的集合实例。Collectors.toUnmodifiableList、Collectors.toUnmodifiableSet、Collectors.toUnmodifiableMap这些方法允许将元素流收集到不可修改的集合中--jdk.disableLastUsageTracking禁用对正在运行的VM的JRE上次使用情况跟踪。--add-stylesheet支持在生成的文档中使用多个样式表。--main-stylesheet有助于区分主样式表和任何其他样式表。添加了@summary标签以明确指定用作API描述摘要的文本。默认情况下,API描述的摘要是从第一句话推断出来的。14.删除APIAPI说明LookAndFeelsRuntime.getLocalizedInputStream,Runtime.getLocalizedOutputStream部分过时的国际化机制,无已知用途。RMI服务器端多路复用协议支持它在JDK9中被禁用,现在已被删除。通用DOMAPI和com.sun.java.browser.plugin2.DOMAPI已被删除。sun.plugin.dom.DOMObject应用程序可以使用netscape.javascript.JSObject来操作DOM。平面分析器在JDK9中已弃用,并且已通过删除实现代码而过时。-Xoss、-Xsqnopause、-Xoptimize、-Xboundthreads和-Xusealtsigs选项已被删除。policytoolpolicytool安全工具已从JDK中删除。已弃用的类com.sun.security.auth.**现在已删除以下类。com.sun.security.auth.PolicyFile`com.sun.security.auth.SolarisNumericGroupPrincipalcom.sun.security.auth.SolarisNumericUserPrincipalcom.sun.security.auth.SolarisPrincipalcom.sun.security.auth.X500Principalcom.sun.security.auth模块.SolarisLoginModule`com.sun.security.auth.module.SolarisSystem总的来说,Java10有许多我们在日常编程中可能不会使用的特性,但它仍然有许多在幕后工作的特性,使它成为重要的里程碑。